SetWindowsHookEx для мыши в 64-битной DLL влияет на движение окна 32-битных приложений - PullRequest
0 голосов
/ 27 августа 2018

У меня есть 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-битный пустой EXE-файл для присоединения 64-битной DLL к 64-битным приложениям
  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-битные приложения, которые фактически управляются 32-битной DLL? Если я не запускаю 64-битный EXE. Все отлично работает.

...