首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C#中使用setwindowshookex: wparam和lparam设置鼠标挂钩总是返回常量

在C#中使用SetWindowsHookEx函数来设置鼠标挂钩时,wParam和lParam参数的返回常量取决于所设置的挂钩类型。

首先,SetWindowsHookEx函数是用于安装一个钩子函数的系统函数,用于监视特定事件或消息的发生。在设置鼠标挂钩时,需要指定挂钩类型为WH_MOUSE_LL或WH_MOUSE。

  1. wParam参数:
    • 当挂钩类型为WH_MOUSE_LL时,wParam参数表示鼠标事件的类型,常见的取值有:
  2. lParam参数:
    • 当挂钩类型为WH_MOUSE_LL时,lParam参数是一个指向MSLLHOOKSTRUCT结构体的指针,该结构体包含了关于鼠标事件的详细信息,包括鼠标位置、按键状态等。
    • MSLLHOOKSTRUCT结构体定义如下:[StructLayout(LayoutKind.Sequential)] public struct MSLLHOOKSTRUCT { public POINT pt; public uint mouseData; public uint flags; public uint time; public IntPtr dwExtraInfo; }
      • pt:鼠标位置,包括x和y坐标
      • mouseData:鼠标滚轮滚动信息
      • flags:鼠标事件的标志位
      • time:事件发生的时间戳
      • dwExtraInfo:额外信息

在C#中使用SetWindowsHookEx函数设置鼠标挂钩的示例代码如下:

代码语言:csharp
复制
using System;
using System.Runtime.InteropServices;

public class MouseHookExample
{
    private const int WH_MOUSE_LL = 14;
    private const int WM_LBUTTONDOWN = 0x0201;

    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);

    [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;
    }

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && wParam == (IntPtr)WM_LBUTTONDOWN)
        {
            MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
            Console.WriteLine("Left button down at: " + hookStruct.pt.x + ", " + hookStruct.pt.y);
        }

        return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam);
    }

    public static void Main()
    {
        LowLevelMouseProc proc = HookCallback;
        IntPtr hookId = SetWindowsHookEx(WH_MOUSE_LL, proc, IntPtr.Zero, 0);

        // Do some work...

        UnhookWindowsHookEx(hookId);
    }
}

以上示例代码演示了如何设置鼠标挂钩,并在鼠标左键按下时输出鼠标位置信息。你可以根据实际需求进行相应的处理和扩展。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Hook 技术简介

    钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。这和前面我博客的窗口子类化都异曲同工,但是Hook可强大多了,我是这两天才开始看的,所以略知皮毛。

    02

    设置全局键盘钩子 和 注意事项

    注意事项 1. SetWindowsHookEx 设置好全局键盘钩子后 一定要 使用 PeekMessage 或 GetMessage 来处理信息,不然程序会 卡死 ,或者 键盘失灵,反正就是 不执行 钩子例程 2. 网上多数看到 设置全局键盘钩子 而没有 PeekMessage 或 GetMessage 处理消息 过程 是因为 他们使用 MFC 编程, MFC中 自带 消息处理过程,而这里直接 空程序 走起则需要自己处理消息 3. 设置 全局键盘钩子 可以不使用 dll ,完全可以直接在一个exe中调用 4. CallNextHookEx 的 第一个 参数 是 忽略 的,MSDN https://msdn.microsoft.com/en-us/library/ms644974(VS.85).aspx 中可以发现 5. 在XP以后的系统中已经无法拦截系统功能键 Ctrl+Alt+Delete 6. 如果要检测 a-z 键,要使用大写 A-Z 不然会无效并且检测到其他按键,小写的 a-z 与其他VK_键重叠

    03

    利用键盘钩子捕捉linux键盘动作,利用键盘钩子捕获Windows键盘动作[通俗易懂]

    引言  在科研生产中对研制、调试操作的记录是非常有必要而且是有很重要价值的。通过对记录信息的分析,可以在事故发生后准确的分析出事故的起因、操作是否存在失误等许多重要线索。通常需要记录的信息是多种多样的,如环境温度记录、软件运行记录、文件访问记录等等。这里将以键盘信息记录为例来讲述类似的实验信息自动记录的一般实现方法。  由于需要记录当前系统下所有应用程序的键盘录入记录,因此必须采取某种特殊的技术来实现本进程(监视程序)对外部进程键盘操作信息的获取。这种技术便是本文将要论述的核心–系统全局钩子。本文下面将对Win32平台下全局钩子的运行机制进行介绍并给出了一个具体的由VC 6.0编写的捕获键盘动作的键盘钩子示例程序。   系统钩子和DLL  钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。  在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC6中有三种形式的MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)、Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。 在本程序中为方便起见采用了标准静态连接MFC DLL。  键盘钩子程序示例  本示例程序用到全局钩子函数,程序分两部分:可执行程序KeyKook和动态连接库LaunchDLL。首先创建一个MFC AppWizard(DLL)工程,并选择Regular statically linked to MFC DLL(标准静态链接MFC DLL)选项,以建立MFC扩展动态连接库LaunchDLL.dll。之后,在相应的头文件中添加宏定义和待导出函数的声明:

    01

    消息钩子的反拦截

    首先声明一下,标题所指的钩子是消息钩子,而不是API钩子(一种对API地址的替换技术)。若标题使您误解,请不要继续阅读。 消息钩子在Windows编程中有着非常广泛的应用,它可以任意拦截Windows系统,这个以消息为驱动的系统中的绝大多数消息类型。一方面这给编程者带来了巨大的灵活性,另一方面也埋下了巨大隐患,大多数窃密软件都使用这种方法。此篇文章给您提供一种钩子的反拦截方法,希望对您有所帮助。文章中使用了API钩子,您之前必须对此技术有一定了解。 为求完整,文章分为两部分,第一部分为消息钩子的使用,熟悉此技术的读者可以直接跳过此节。第二部分为消息钩子的反拦截。 一、消息钩子的使用。 消息钩子分为本地(local)和远程(remote)两种(两个local system-wide hook例外,无关主题,不多说了)。local类型的钩子函数只能拦截本进程的消息。能够拦截本进程以外的消息的钩子,都是remote类型。remote类型的钩子必须放在DLL里面。下面以remote类型为例,通过安装键盘钩子介绍其使用。 1、首先建立DLL,在头文件中添加如下代码。 #ifdef KM_EXPORTS #define KM_API __declspec(dllexport) #else #define KM_API __declspec(dllimport) #endif KM_API BOOL HookStart();//安装钩子 KM_API BOOL HookStop();//卸载钩子 2、在.cpp文件中添加代码 #pragma data_seg(“Shared”) HHOOK g_hhookKey=NULL; #pragma data_seg() #pragma comment(linker,”/SECTION:Shared,RWS”) g_hhookKey为键盘钩子的句柄,为确保此数值在所有实例中均保持不变,将其存放于此模块所有实例的共享数据区,若在exe程序中按此格式添加一int 变量 appNum,在程序启动时appNum++,则可以通过访问此变量的数值,确定有多少个exe的实例,当然这种方法也可以替代同步对象用于只启动一个实例。 HINSTANCE g_hinstDll=NULL; //添加全局变量用于记录此DLL模块的句柄 BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: g_hinstDll=(HINSTANCE)hModule;//在DLL加载时对全局变量赋值 ……………… } } LRESULT KeyHookProc(int nCode,WPARAM wParam,LPARAM lParam)//键盘钩子的过滤函数 { ………………… return::CallNextHookEx(g_hhookKey,nCode,wParam,lParam);//*****请留意此行代码***** } BOOL HookStart()//安装钩子 { g_hhookKey=::SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyHookProc,g_hinstDll, ::GetWindowThreadProcessId(::FindWindow(NULL,”被监视的窗口的标题“),NULL) ); return (g_hhookKey!=NULL); } BOOL HookStop()//卸载钩子 { BOOL ret; if(g_hhookKey!=NULL) ret=::UnhookWindowsHookEx(g_hhookKey);

    03
    领券