重新安装Win7 x64后,MouseHook + SendInput停止工作

时间:2014-09-02 21:35:20

标签: c# visual-studio-2013 64-bit hook sendinput

我在几个月前编写了一个小型KeyMapper,用于我的台式机和笔记本电脑(PC:Win7 x64,Notebook:Win8.1 x64)。它总是完美无缺,直到我决定在我的主PC上重新安装Windows(从Win7 64bit到(再次)Win7 x64)。

所以这是代码:

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
    if (nCode >= 0)
    {
        if ((int)wParam == WM_MOUSEMOVE)
        {
            var hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
            Debug.WriteLine("dwExtraInfo: " + hookStruct.dwExtraInfo);

            // block all MouseEvents with dwExtraInfo not IntPtr(555)
            try
            {
                if (hookStruct.dwExtraInfo != new IntPtr(555))
                    return new IntPtr(1);
            }
            catch (Exception ex){ }                     
        }
    }
    // let all other mousemessages pass
    return CallNextHookEx(_hookID, nCode, wParam, lParam);
}

如您所见,我正在过滤所有MouseMoveMessages。我的SendInput函数发送自定义MouseMoveMessages,其ExtraInfo设置为一个随机值(此处为555),该值应通过此过滤器。

INPUT[] iMM = new INPUT[1]
iMM[0].type = InputType.INPUT_MOUSE;
iMM[0].mkhi.mi.dx = 500;  // example
iMM[0].mkhi.mi.dy = 500;  // example
iMM[0].mkhi.mi.mouseData = 0;
iMM[0].mkhi.mi.dwFlags = (MOUSEEVENTF.MOVE | MOUSEEVENTF.ABSOLUTE);
iMM[0].mkhi.mi.time = 0;                                                   
iMM[0].mkhi.mi.dwExtraInfo = new IntPtr(555);

// Install MouseHook
LowLevelMouseProc _proc = HookCallback;
_hookID = SetWindowsHookEx(WH_MOUSE_LL, _proc, GetModuleHandle("user32"), 0);

// send MouseMessage
SendInput(1, iMM, Marshal.SizeOf(new INPUT()));

出了什么问题: 重新安装Win7后64位dwExtraInfo完全搞定,它显示的值如-11054848(定义为IntPtr时)和4283912448(定义为UIntPtr时)。请注意,它在重新安装之前已经工作了几个月,并且仍然在我的笔记本中工作。

我已经测试了所有对象的大小(INPUT-struct,MSLLHOOKSTRUCT,dwExtraInfo ...),但它们在两台机器上完全相同。目标平台是x86,Framework是4.0。

在我的笔记本电脑(Win8.1 x64)上,一切仍然按预期工作,SendInput发送MouseMove消息,这些消息被LowLevelHook捕获并过滤。 dwExtraInfo是555。

1 个答案:

答案 0 :(得分:2)

开始解决这样的问题的一般策略是将幻数转换为十六进制。你得到0xFF575100。这是Google真正喜欢的数字,它会直接转到this MSDN Forums post

长话短说,你获得了一个破损的安全补丁,MS14-039。由PenPower工程师确定:

  

更新KB2973201后,Windows将返回" 0XFF575100"和鼠标无法正常工作
  dwExtraInfo = 0XFF575100

Microsoft发布了针对该问题的修复程序described here。如果您仍然遇到问题,请在superuser.com上进行跟进,或直接与Microsoft支持部门联系。