我在几个月前编写了一个小型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。
答案 0 :(得分:2)
开始解决这样的问题的一般策略是将幻数转换为十六进制。你得到0xFF575100。这是Google真正喜欢的数字,它会直接转到this MSDN Forums post。
长话短说,你获得了一个破损的安全补丁,MS14-039。由PenPower工程师确定:
更新KB2973201后,Windows将返回" 0XFF575100"和鼠标无法正常工作
dwExtraInfo = 0XFF575100
Microsoft发布了针对该问题的修复程序described here。如果您仍然遇到问题,请在superuser.com上进行跟进,或直接与Microsoft支持部门联系。