SetWindowsHookEx c#

Posted

技术标签:

【中文标题】SetWindowsHookEx c#【英文标题】: 【发布时间】:2020-08-18 10:51:46 【问题描述】:

我想挂钩一个特定进程而不是全局挂钩,但我不知道在调用它时我必须在 SetWindowsHookEx 中放入什么。

我不明白HookProc和第三个参数是什么。

public Form1()

    InitializeComponent();

public enum HookType : int
        
            WH_JOURNALRECORD = 0,
            WH_JOURNALPLAYBACK = 1,
            WH_KEYBOARD = 2,
            WH_GETMESSAGE = 3,
            WH_CALLWNDPROC = 4,
            WH_CBT = 5,
            WH_SYSMSGFILTER = 6,
            WH_MOUSE = 7,
            WH_HARDWARE = 8,
            WH_DEBUG = 9,
            WH_SHELL = 10,
            WH_FOREGROUNDIDLE = 11,
            WH_CALLWNDPROCRET = 12,
            WH_KEYBOARD_LL = 13,
            WH_MOUSE_LL = 14
        
[DllImport("user32.dll", SetLastError = true)]                                   
static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);

[DllImport("user32.dll", SetLastError = true)]                                  
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
      
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetWindowsHookEx(HookType hookType, HookProc lpfn, IntPtr hMod, uint dwThreadId);


[DllImport("user32.dll")]
static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

delegate IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam);

public uint findWindowThreadId()
        
            uint idprocess;
            idFirstGt = GetWindowThreadProcessId(FindWindow(default(string), "ProcessName"), IntPtr.Zero);
            return idProcess;
        
public void SetHook()
        
            hhook = SetWindowsHookEx(HookType.WH_KEYBOARD,/* HERE  , AND HERE */, findWindowThreadId());
        

谢谢!

【问题讨论】:

【参考方案1】:

HookProc 是您希望在 HookType 发生时执行的回调函数(您编写的)。

第三个参数(IntPtr hMod)仅在您的 HookProc 驻留在另一个库(又名 DLL)中时才相关。如果在您的代码中定义了 HookProc,那么您可以为此第三个参数指定 NULL。

【讨论】:

以上是关于SetWindowsHookEx c#的主要内容,如果未能解决你的问题,请参考以下文章

为啥必须将 SetWindowsHookEx 与 Windows 消息队列一起使用

增加 Windows 7 中的 SetWindowsHookEx 限制

WH_JOURNALRECORD 的 SetWindowsHookEx 在 Vista/Windows 7 下失败

SetWindowsHookEx 问题的文档

SetWindowsHookEx 用法的区别

SetWindowsHookEx 与 Qt4 中的 WH_JOURNALRECORD 挂钩