c#做的全局鼠标/键盘钩子

时间: 2023-06-15 11:02:14 浏览: 85
对于C语言,作为一种高效的程序设计语言,它被广泛应用于嵌入式系统的开发和底层编程。同时,C语言也是其他编程语言的基础。在学习过程中,我们需要掌握的知识包括语法、指针、结构体、库函数等。C语言的语法简单规范,易于学习,同时它的指针概念也很重要,可以实现动态内存分配、数组操作等,但也容易出现指针误用等问题。C语言使用结构体可以将多个数据类型封装在一起,方便程序员对数据类型的选择和操作。C标准库函数提供了大量的功能,比如字符串处理、数学计算等,可以大大简化编程工作。总的来说,学习C语言可以使我们更深入地了解计算机底层工作原理,提高编程能力,并为未来学习其他编程语言打下坚实的基础。
相关问题

C#全局鼠标钩子完整源码

以下是C#全局鼠标钩子的完整源码: 首先,创建一个名为MouseHook的类,实现IMouseHook接口: ```csharp using System; using System.Runtime.InteropServices; namespace MouseHookExample { public class MouseHook : IMouseHook { private const int WH_MOUSE_LL = 14; private const int WM_LBUTTONDOWN = 0x0201; private const int WM_RBUTTONDOWN = 0x0204; private LowLevelMouseProc _proc; private IntPtr _hookId = IntPtr.Zero; public event EventHandler<MouseEventArgs> LeftButtonDown; public event EventHandler<MouseEventArgs> RightButtonDown; public void Start() { _proc = HookCallback; _hookId = SetHook(_proc); } public void Stop() { UnhookWindowsHookEx(_hookId); _hookId = IntPtr.Zero; } private IntPtr SetHook(LowLevelMouseProc proc) { using (var curProcess = System.Diagnostics.Process.GetCurrentProcess()) using (var curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } } private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && (wParam == (IntPtr)WM_LBUTTONDOWN || wParam == (IntPtr)WM_RBUTTONDOWN)) { var hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT)); var args = new MouseEventArgs(hookStruct.pt.x, hookStruct.pt.y); if (wParam == (IntPtr)WM_LBUTTONDOWN) { LeftButtonDown?.Invoke(this, args); } else if (wParam == (IntPtr)WM_RBUTTONDOWN) { RightButtonDown?.Invoke(this, args); } } return CallNextHookEx(_hookId, nCode, wParam, lParam); } private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr GetModuleHandle(string lpModuleName); [StructLayout(LayoutKind.Sequential)] private struct POINT { public int x; public int y; } [StructLayout(LayoutKind.Sequential)] private struct MSLLHOOKSTRUCT { public POINT pt; public uint mouseData; public uint flags; public uint time; public IntPtr dwExtraInfo; } } } ``` 接下来,定义一个名为MouseEventArgs的类,用于传递鼠标事件的参数: ```csharp using System; namespace MouseHookExample { public class MouseEventArgs : EventArgs { public int X { get; } public int Y { get; } public MouseEventArgs(int x, int y) { X = x; Y = y; } } } ``` 最后,定义一个名为IMouseHook的接口,用于规范MouseHook类的实现: ```csharp using System; namespace MouseHookExample { public interface IMouseHook { event EventHandler<MouseEventArgs> LeftButtonDown; event EventHandler<MouseEventArgs> RightButtonDown; void Start(); void Stop(); } } ``` 现在,我们可以在其他类中使用该鼠标钩子: ```csharp using System; namespace MouseHookExample { class Program { static void Main(string[] args) { var mouseHook = new MouseHook(); mouseHook.LeftButtonDown += (sender, e) => Console.WriteLine($"Left button down at ({e.X}, {e.Y})"); mouseHook.RightButtonDown += (sender, e) => Console.WriteLine($"Right button down at ({e.X}, {e.Y})"); mouseHook.Start(); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); mouseHook.Stop(); } } } ``` 现在,当用户按下鼠标左键或右键时,程序将在控制台中输出相应的信息。

C# 用全局钩子使鼠标按键左右键互换,鼠标移动反向相反

实现这个需求需要使用 C# 中的钩子函数来实现全局鼠标事件监听。具体步骤如下: 1. 引入 System.Runtime.InteropServices 命名空间。 2. 定义鼠标事件枚举类型: ```csharp public enum MouseEventFlags { LEFTDOWN = 0x00000002, LEFTUP = 0x00000004, MIDDLEDOWN = 0x00000020, MIDDLEUP = 0x00000040, MOVE = 0x00000001, ABSOLUTE = 0x00008000, RIGHTDOWN = 0x00000008, RIGHTUP = 0x00000010, WHEEL = 0x00000800, XDOWN = 0x00000080, XUP = 0x00000100 } ``` 3. 定义 MouseHookStruct 结构体: ```csharp [StructLayout(LayoutKind.Sequential)] public struct MouseHookStruct { public POINT pt; public int hwnd; public int wHitTestCode; public int dwExtraInfo; } ``` 4. 定义全局鼠标事件委托类型: ```csharp public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam); ``` 5. 定义全局变量和函数: ```csharp private static int hHook = 0; private static HookProc HookProcedure; [DllImport("user32.dll")] public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); [DllImport("user32.dll")] public static extern int CallNextHookEx(int hHook, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] public static extern int UnhookWindowsHookEx(int hHook); ``` 6. 实现钩子函数: ```csharp private static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0) { MouseHookStruct mhs = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct)); if (wParam == (IntPtr)MouseEventFlags.LEFTDOWN) { MouseEventFlags button = MouseEventFlags.LEFTDOWN; MouseEventFlags swappedButton = MouseEventFlags.RIGHTDOWN; SwapMouseButton(button, swappedButton); } else if (wParam == (IntPtr)MouseEventFlags.RIGHTDOWN) { MouseEventFlags button = MouseEventFlags.RIGHTDOWN; MouseEventFlags swappedButton = MouseEventFlags.LEFTDOWN; SwapMouseButton(button, swappedButton); } else if (wParam == (IntPtr)MouseEventFlags.MOVE) { int x = mhs.pt.X; int y = mhs.pt.Y; SwapMouseMovement(ref x, ref y); mhs.pt.X = x; mhs.pt.Y = y; Marshal.StructureToPtr(mhs, lParam, true); } } return CallNextHookEx(hHook, nCode, wParam, lParam); } ``` 7. 实现鼠标按键互换和鼠标移动反向相反的方法: ```csharp private static void SwapMouseButton(MouseEventFlags button, MouseEventFlags swappedButton) { int flags = GetSystemMetrics(0x0010); if ((flags & 0x0001) != 0) { // Primary mouse button is currently left button if ((button == MouseEventFlags.LEFTDOWN) || (button == MouseEventFlags.LEFTUP)) { mouse_event((int)swappedButton, 0, 0, 0, 0); } else if ((button == MouseEventFlags.RIGHTDOWN) || (button == MouseEventFlags.RIGHTUP)) { mouse_event((int)MouseEventFlags.LEFTDOWN, 0, 0, 0, 0); mouse_event((int)MouseEventFlags.LEFTUP, 0, 0, 0, 0); } } else { // Primary mouse button is currently right button if ((button == MouseEventFlags.RIGHTDOWN) || (button == MouseEventFlags.RIGHTUP)) { mouse_event((int)swappedButton, 0, 0, 0, 0); } else if ((button == MouseEventFlags.LEFTDOWN) || (button == MouseEventFlags.LEFTUP)) { mouse_event((int)MouseEventFlags.RIGHTDOWN, 0, 0, 0, 0); mouse_event((int)MouseEventFlags.RIGHTUP, 0, 0, 0, 0); } } } private static void SwapMouseMovement(ref int x, ref int y) { int width = Screen.PrimaryScreen.Bounds.Width; int height = Screen.PrimaryScreen.Bounds.Height; x = width - x; y = height - y; } ``` 8. 注册全局钩子并启动: ```csharp HookProcedure = new HookProc(MouseHookProc); hHook = SetWindowsHookEx(14, HookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0); ``` 需要注意的是,这里使用了 user32.dll 中的一些函数,需要在代码中进行引用。同时,这里使用了 SetWindowsHookEx 函数注册了一个全局鼠标钩子,需要在程序关闭时调用 UnhookWindowsHookEx 函数取消注册。

相关推荐

最新推荐

recommend-type

C#实现可捕获几乎所有键盘鼠标事件的钩子类完整实例

主要介绍了C#实现可捕获几乎所有键盘鼠标事件的钩子类,以完整实例形式分析了C#捕获键盘鼠标事件的钩子操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
recommend-type

C#中winform实现自动触发鼠标、键盘事件的方法

主要介绍了C#中winform实现自动触发鼠标、键盘事件的方法,是C#程序设计中非常实用的功能,需要的朋友可以参考下
recommend-type

C#设置键盘钩子屏蔽键盘信息

C#键盘勾子(Hook)拦截器,屏蔽键盘活动 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口...
recommend-type

用C# 实现鼠标框选效果的实现代码

本篇文章是对用C#实现鼠标框选效果的实现代码进行了详细的分析介绍,需要的朋友参考下
recommend-type

C#实现鼠标移动到曲线图上显示值的方法

主要介绍了C#实现鼠标移动到曲线图上显示值的方法,是C#的WinForm窗体程序设计中非常实用的技巧,需要的朋友可以参考下
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章

![:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章](https://img-blog.csdnimg.cn/img_convert/69b98e1a619b1bb3c59cf98f4e397cd2.png) # 1. 目标检测算法概述 目标检测算法是一种计算机视觉技术,用于识别和定位图像或视频中的对象。它在各种应用中至关重要,例如自动驾驶、视频监控和医疗诊断。 目标检测算法通常分为两类:两阶段算法和单阶段算法。两阶段算法,如 R-CNN 和 Fast R-CNN,首先生成候选区域,然后对每个区域进行分类和边界框回归。单阶段算法,如 YOLO 和 SSD,一次性执行检
recommend-type

info-center source defatult

这是一个 Cisco IOS 命令,用于配置 Info Center 默认源。Info Center 是 Cisco 设备的日志记录和报告工具,可以用于收集和查看设备的事件、警报和错误信息。该命令用于配置 Info Center 默认源,即设备的默认日志记录和报告服务器。在命令行界面中输入该命令后,可以使用其他命令来配置默认源的 IP 地址、端口号和协议等参数。
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。