SetWindowsHookEx c#

问题描述

我想钩住一个特定的进程而不是全局钩子,但是我不知道在调用它时必须在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 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());
        }

谢谢!

解决方法

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

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