У меня есть 32-битная программа, которая порождает поставляемые приложения с CreateProcess
и присоединяет 32-битную DLL для захвата событий мыши. И это работает просто отлично. DLL отправляет данные в основную программу с помощью SendMessage
.
Эта программа также может порождать 64-битные приложения, и она должна прикрепить к ним 64-битную DLL. Поэтому я просто сделал копию из 32-битного проекта и изменил битность. Затем я очистил 64-битный EXE (потому что логика уже в 32-битном EXE).
После всех этих шагов у меня есть:
- 32-битный EXE-файл для порождения приложений и управления движением окна
- 32 DLL, которая присоединяется ко всем 32-битным приложениям, захватывает сообщения мыши и отправляет в x32 EXE
- 64-битный пустой EXE-файл для присоединения 64-битной DLL к 64-битным приложениям
- 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-битные приложения, которые фактически управляются 32-битной DLL? Если я не запускаю 64-битный EXE. Все отлично работает.