SetWindowsHookEx由C#生成的另一个进程总是返回0 IntPtr

时间:2014-04-03 09:02:26

标签: c# setwindowshookex

我正在尝试将鼠标单击事件挂钩到由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。

enter image description here

1 个答案:

答案 0 :(得分:1)

您不能在C#中使用全局WH_MOUSE挂钩,或者在不同进程中使用线程特定的WH_MOUSE挂钩。这需要一个非托管DLL。

从托管代码中,您需要使用低级鼠标挂钩WH_MOUSE_LL。如果你确实需要WH_MOUSE,那么你需要在本机代码中编写钩子,以便可以将DLL注入目标进程。