我正在尝试将鼠标单击事件挂钩到由C#组成的Windows应用程序。
这是我的代码;
private const int WH_MOUSE = 7;
[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId);
private static IntPtr SetHook(LowLevelMouseProc proc)
{
IntPtr hWnd = IntPtr.Zero;
uint processId = 0;
uint threadID = 0;
string moduleName = string.Empty;
Process[] localAll = Process.GetProcesses();
string toFindModule ="windowsformsapplication1.exe";
foreach (Process p in localAll)
{
if (p.MainWindowHandle != IntPtr.Zero)
{
ProcessModule pm = GetModule(p);
if (pm != null && p.MainModule.FileName.ToLower().IndexOf(toFindModule) > -1)
{
hWnd = p.MainWindowHandle;
threadID = GetWindowThreadProcessId(hWnd, out processId);
break;
}
}
}
IntPtr ret = SetWindowsHookEx(WH_MOUSE, proc, IntPtr.Zero, threadID);
return ret;
}
我已经确定了WindowsFormsApplication1.exe的线程ID。
但是,IntPtr ret = SetWindowsHookEx(WH_MOUSE, proc, IntPtr.Zero, threadID);
总是返回0;
所以,我启用了钩子鼠标点击事件。
我的代码有问题吗?
我甚至试过calc.exe
,但也没有运气。
修改
而且我很确定我捕获了目标winform的正确线程ID。
答案 0 :(得分:1)
您不能在C#中使用全局WH_MOUSE
挂钩,或者在不同进程中使用线程特定的WH_MOUSE
挂钩。这需要一个非托管DLL。
从托管代码中,您需要使用低级鼠标挂钩WH_MOUSE_LL
。如果你确实需要WH_MOUSE
,那么你需要在本机代码中编写钩子,以便可以将DLL注入目标进程。