用于64位DLL中的鼠标的SetWindowsHookEx影响32位应用程序的窗口移动

时间:2018-08-27 12:43:46

标签: c++ winapi dll dll-injection setwindowshookex

我有一个32位程序,它使用CreateProcess生成提供的应用程序,并附加32位DLL来捕获鼠标事件。而且效果很好。 DLL使用SendMessage将数据发送到主程序。

此程序还可以生成64位应用程序,并且必须将64位DLL附加到它们。所以我只是从32位项目中进行了复制,并更改了位。然后我清除了64位EXE(因为32位EXE中已经存在逻辑)。

完成所有步骤后,

  1. 用于生成应用程序和控制窗口移动的32位EXE文件
  2. 32 DLL,可附加到所有32位应用程序,捕获鼠标消息并发送到x32 EXE
  3. 用于将64位DLL附加到64位应用程序的64位空EXE
  4. 64位DLL捕获鼠标消息并将数据发送到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。一切正常。

0 个答案:

没有答案