【问题标题】:WH_MOUSE_LL not responding to injected eventsWH_MOUSE_LL 没有响应注入的事件
【发布时间】:2013-11-15 18:02:12
【问题描述】:

类似于this unanswered question,我们使用SendInput / mouse_event / SetCursorPos 以编程方式移动鼠标并发送鼠标点击。我们还想使用WH_MOUSE_LL windows hooks 捕获机器上的所有鼠标事件。我们使用MSLLHOOKSTRUCT,其中包含一个专门用于识别注入鼠标事件的标志属性。然而,我们的回调永远不会被注入事件调用。

var threadId = 0U;
var moduleHandle = GetModuleHandle("user32");

IntPtr hookId = SetWindowsHookEx(WH_MOUSE_LL, ourCallback, moduleHandle, threadId);

if (hookId == IntPtr.Zero)
{
    log.Error("Could not start getting global mouse messages.");

    throw new System.ComponentModel.Win32Exception();
}

我们的 hookId 永远不会是 IntPtr.Zero 并使用 UnhookWindowsHookEx 成功删除它意味着钩子确实存在。

为什么我们没有收到SendInput / mouse_event / SetCursorPos 生成的事件?

【问题讨论】:

  • 使用所有三种方法来移动鼠标几乎没有意义。这使得您很可能实际上只是在使用 SetCursorPos(),它确实不会触发钩子。
  • 我们不使用所有三个,但我们已经尝试了所有三个。我们一次只使用一个哈哈,如果不清楚,对不起!

标签: c# .net winapi mouseevent hook


【解决方案1】:

你应该像这样使用SetWindowsHookEx

private delegate IntPtr WindowHookHandler(int nCode, IntPtr wParam, IntPtr lParam);
private static WindowHookHandler MouseHookHandler = myCallbackFunction;

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, WindowHookHandler lpfn, IntPtr hMod, uint dwThreadId);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);

private static IntPtr MouseHook = IntPtr.Zero;

private static IntPtr SetHook(int hookId, WindowHookHandler callbackFunc)
{
    using (System.Diagnostics.Process curProcess = System.Diagnostics.Process.GetCurrentProcess())
    {
        using (System.Diagnostics.ProcessModule curModule = curProcess.MainModule)
        {
            return SetWindowsHookEx(hookId, callbackFunc, GetModuleHandle(curModule.ModuleName), 0);
        }
    }
}

private static void SomeFunction()
{
    MouseHook = SetHook(WH_MOUSE_LL, MouseHookHandler);

    // message loop here
    // waiting for events

    UnhookWindowsHookEx(MouseHook);
}

private static IntPtr myCallbackFunction(int nCode, IntPtr wParam, IntPtr lParam)
{
    // do something here

    // ALWAYS return like this!
    return CallNextHookEx(MouseHook, nCode, wParam, lParam);
}

我曾尝试测试LLMHF_INJECTED 的标志,但从未成功。 我改用dwExtraInfo 字段。如果您正在创建一个事件,请在其中放置一些独特的数据,并在事件侦听器中监视这些数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-26
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2022-01-10
    • 2011-05-17
    • 2014-03-18
    相关资源
    最近更新 更多