`
net_liu
  • 浏览: 231316 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用鼠标钩子将鼠标中键转为左键

 
阅读更多
   利用鼠标钩子将鼠标中键转为左键

 鼠标的左键由于使用的多,容易损坏,我用的一个微软鼠标左键就出现了问题,点击左键没有响应了.把鼠标拆开后,也没发现什么物理性的损伤.按键还是那么 清脆,但就是没反应.网上有说可以将中键取下来换到左键上,但是,需要用电焊,按键底下的接口是与线路板焊在一起的,这可没办法了,总不能再去买个焊枪.
    硬的不行,就只有来软的了.通过截获鼠标按键消息,将中键的消息转换为左键消息发出去,实现中键转左键的功能.要实现这个功能,只能通过挂载鼠标构子函 数SetWindowsHookEx,在处理完中键转换任务后,一定要记着调用CallNextHookEx函数,将鼠标消息传下去,不然,鼠标可就动不 了了. 下面是实现的代码.
MouseHookWin32.cs代码文件:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace QingMouseHook
{
    public class MouseHookWin32
    {
        // wParam对应码

        public const int WM_LBUTTONDOWN = 0x201;
        public const int WM_MBUTTONDOWN = 0x207;
        public const int WM_LBUTTONUP = 0x202;
        public const int WM_MBUTTONUP = 0x208;

        // mouse_event消息码

        public const int MOUSEEVENTF_LEFTDOWN = 0x0002;
        public const int MOUSEEVENTF_LEFTUP = 0x0004;
        public const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;
        public const int MOUSEEVENTF_MIDDLEUP = 0x0040;

        public const int WH_MOUSE_LL = 14; // 表示鼠标钩子


        public delegate int MouseHookHandler(int nCode, Int32 wParam, IntPtr lParam);

        // 设置钩子函数

        [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int SetWindowsHookEx(int idHook, MouseHookHandler lpfn, IntPtr hInstance, int threadId);

        // 卸载钩子函数

        [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern bool UnhookWindowsHookEx(int idHook);

        // 调用下一个钩子函数

        [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);

        // 获取最后的错误

        [DllImport("kernel32", EntryPoint = "GetLastError")]
        public static extern int GetLastError();

        [DllImport("user32")]
        public static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
    }
}
 MouseHook.cs代码文件,具体实现转换功能:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Runtime.InteropServices;

namespace QingMouseHook
{
    public class MouseHook
    {
        private static int hwndMouseHook = 0; // 加载鼠标钩子后的句柄

        
        /// <summary>

        /// 装载鼠标钩子

        /// </summary>

        public void SetHook()
        {
            if (hwndMouseHook == 0)
            {
                MouseHookWin32.MouseHookHandler handler = new MouseHookWin32.MouseHookHandler(this.HookHandle);
                hwndMouseHook = MouseHookWin32.SetWindowsHookEx(MouseHookWin32.WH_MOUSE_LL,
                    handler, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);

                if (hwndMouseHook == 0)
                {
                    this.UnHook();

                    int errno = MouseHookWin32.GetLastError();
                    throw new Exception(errno.ToString());
                }
            }
        }

        /// <summary>

        /// 卸载鼠标钩子

        /// </summary>

        public void UnHook()
        {
            if (hwndMouseHook == 0) return;

            bool isSuc = MouseHookWin32.UnhookWindowsHookEx(hwndMouseHook);
            if (!isSuc) throw new Exception("卸载鼠标钩子失败");
        }

        /// <summary>

        /// 处理钩子中的鼠标消息,发送鼠标模拟按键

        /// </summary>

        private int HookHandle(int nCode, int wParam, IntPtr lParam)
        {
            switch (wParam)
            {
                case MouseHookWin32.WM_MBUTTONDOWN :
                    MouseHookWin32.mouse_event(MouseHookWin32.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                    break;
                case MouseHookWin32.WM_MBUTTONUP :
                    MouseHookWin32.mouse_event(MouseHookWin32.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
                    break;
            }

            // 调用下一个钩子

            return MouseHookWin32.CallNextHookEx(hwndMouseHook, nCode, wParam, lParam);
        }
    }
}
 在调用程序的代码中,只要调用MouseHook的SetHook即可装载鼠标钩子,UnHook卸载钩子.
分享到:
评论

相关推荐

    鼠标左键点击消息钩子

    这种技术通常涉及到Windows API(应用程序接口)中的钩子机制,尤其是WH_MOUSE_LL(低级鼠标钩子)类型。下面我们将深入探讨这一主题。 首先,我们来理解“钩子”是什么。在Windows编程中,钩子是一种机制,允许一...

    HookMouseKey_Delphi.rar_delphi 键盘钩子_键盘鼠标钩子

    总之,“HookMouseKey_Delphi.rar”提供了一个实用的Delphi项目,它展示了如何在Delphi环境下利用Windows API实现键盘和鼠标钩子,以及如何记录和回放这些事件。这对于深入理解系统级编程和事件处理机制是非常有价值...

    全局鼠标钩子

    下面将详细介绍全局鼠标钩子的工作原理、应用以及相关的编程知识。 1. **全局鼠标钩子工作原理** 全局鼠标钩子是通过Windows的消息机制实现的。`SetWindowsHookEx`函数用于安装一个钩子,参数中需要指定钩子类型...

    VB.NET全局键盘鼠标钩子

    为了在VB.NET中实现全局键盘和鼠标钩子,需要利用Windows API函数,具体步骤如下: 1. **注册钩子**:通过调用`SetWindowsHookEx`函数注册一个钩子。 2. **处理消息**:编写钩子过程来处理捕获到的消息。 3. **传递...

    C# 鼠标钩子 监测鼠标双击事件

    综上所述,"C# 鼠标钩子 监测鼠标双击事件"是一个关于如何在C#中利用Windows API实现全局鼠标事件监听的实例,特别是对双击事件的捕捉和处理。开发者可以通过此项目学习到如何设置和管理鼠标钩子,以及如何在C#中...

    利用钩子函数键盘鼠标键盘事件

    这使得开发人员可以监控、修改或控制系统的某些行为,比如在这个例子中,我们要讨论的是如何利用钩子函数来监听和处理键盘及鼠标事件。 键盘和鼠标事件是用户与计算机进行交互的基本方式,通过监听这些事件,开发者...

    鼠标和键盘的全局钩子,及简单示例

    一个DLL用来写全局钩子(鼠标钩子用来把鼠标限定在某个区域中和键盘钩子用来钩小键盘的数据“0”和ALT+F用来决定是否把鼠标限定在区域中), 2.一个TESTDLL单文档结构的简单MFC程序,只加了一个左键消息,该消息...

    C#鼠标钩子和键盘事件

    在本文中,我们将深入探讨C#编程中关于“全局按键”、“鼠标钩子”和“键盘事件”的概念,以及如何在Visual Studio 2005环境下实现这些功能。首先,我们要明白C#是一种广泛用于开发桌面应用、Web应用和服务的强大...

    键盘与鼠标钩子程式源码

    标题中的“键盘与鼠标钩子程式源码”指的是在编程中使用的一种技术,它涉及到...解压后,开发者可以通过查看源代码学习如何在BCB5.0环境下实现键盘和鼠标钩子,这将有助于理解Windows编程中的钩子机制和事件处理。

    一个鼠标全局钩子的例子(完整)

    全局钩子是Windows操作系统中的一种技术,允许程序在系统级别捕获和处理特定类型的事件,如鼠标活动。 【描述】中的“这是完整的鼠标全局钩子的源码,希望能够给予初学者一点帮助!!!”指出,这个源码是为编程...

    VB实现鼠标钩子程序

    在VB(Visual Basic)编程环境中,我们可以创建一个鼠标钩子程序来监听和处理系统的鼠标事件。这个技术主要基于Windows API(应用程序接口),通过设置系统级钩子,来捕获和处理全局的鼠标输入。下面将详细讲解如何...

    鼠标钩子示例代码,区分鼠标的左右按键,并且画不同颜色的圆晕以醒目提示。

    下面我们将深入探讨鼠标钩子的工作原理、如何创建和使用,以及在代码示例中如何区分鼠标的左右按键并显示不同颜色的圆晕。 首先,我们来看一下鼠标钩子的工作流程。在Windows API中,`SetWindowsHookEx`函数用于...

    系统键盘鼠标钩子

    系统键盘鼠标钩子是一种在Windows操作系统中用于监听和拦截键盘和鼠标事件的技术。它通过设置系统级别的钩子来实现对用户输入的全面监控。这种技术通常由开发者使用,以实现特定的功能,例如输入记录、自动化测试...

    c#键盘鼠标钩子

    在IT领域,尤其是在Windows应用程序开发中,"键盘鼠标钩子"是一种高级技术,它允许程序拦截和处理系统中其他应用程序的键盘和鼠标事件。在C#编程语言中,实现这样的功能通常涉及到对Windows API(应用程序接口)的...

    vc++6.0鼠标钩子程序

    3. **处理消息**:在钩子函数中,你可以根据`nCode`和`wParam`、`lParam`的值来判断并处理不同类型的鼠标事件,如鼠标移动、左键单击、右键单击等。 4. **卸载钩子**:为了释放资源,避免内存泄漏,当不再需要钩子...

    鼠标键盘钩子例子 后门F2键

    在这个“鼠标键盘钩子例子 后门F2键”中,我们主要探讨的是如何通过钩子来捕获和控制鼠标与键盘的输入事件,并且利用F2键作为后门的触发机制。 首先,我们要理解什么是钩子。在Windows操作系统中,钩子是一种系统...

    非常好的鼠标钩子

    【鼠标钩子】是一种在计算机编程中用于监听和拦截鼠标事件的技术。在Windows操作系统中,鼠标钩子允许程序员设置一个钩子函数,该函数会在指定类型的鼠标事件发生时被调用,例如鼠标移动、点击等。这使得开发者可以...

    bcb鼠标钩子Hook

    【标题】"bcb鼠标钩子Hook"是一个关于在 Borland C++ Builder (简称BCB) 开发环境中实现鼠标钩子的技术主题。鼠标钩子是Windows API提供的一种机制,允许程序监视和处理特定类型的鼠标事件,如鼠标移动、点击等,...

    易语言鼠标钩子例程

    它接受一个钩子类型(在这里是鼠标钩子),一个钩子处理函数地址,一个模块句柄以及一个线程ID,用于指定钩子将在哪个线程中运行。在易语言中,你需要定义这个函数并传入相应的参数来设置鼠标钩子。 2. **...

Global site tag (gtag.js) - Google Analytics