我有一个32位程序,它使用CreateProcess
生成提供的应用程序,并附加32位DLL来捕获鼠标事件。而且效果很好。 DLL使用SendMessage
将数据发送到主程序。
此程序还可以生成64位应用程序,并且必须将64位DLL附加到它们。所以我只是从32位项目中进行了复制,并更改了位。然后我清除了64位EXE(因为32位EXE中已经存在逻辑)。
完成所有步骤后,
问题是,当我在64位DLL中设置钩子时:
::SetWindowsHookEx(WH_MOUSE, MouseProc, ModuleFromAddress(MouseProc), dwThreadId);
窗口移动非常不稳定。 MouseProc
就这么简单:
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
return ::CallNextHookEx(NULL, nCode, wParam, lParam);
}
即使对于32位应用程序,它仍然会产生运动问题。 32位DLL中的相同过程如下所示:
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (hookWindow) {
if (wParam == WM_NCLBUTTONUP || wParam == WM_LBUTTONUP) {
// send data to main EXE the click was done
}
else if (wParam != WM_NCLBUTTONDOWN && wParam != WM_LBUTTONDOWN) {
if (moving) {
return true; // another routine does movement
}
}
}
return ::CallNextHookEx(NULL, nCode, wParam, lParam);
}
为什么带有空钩子过程的64位DLL会影响实际上由32位DLL管理的32位应用程序?如果我不运行64位EXE。一切正常。