SetWindowsHookEx, чтобы определить, когда окно деактивировано - PullRequest
0 голосов
/ 10 июля 2019

У меня есть глобальный WH_CBT 32-битный хук, который я использую, чтобы определить, когда окно будет активировано с помощью HCBT_ACTIVATE.

Как определить, когда окно должно быть деактивировано? Существует CBTACTIVATESTRUCT с hWndActive, но иногда 0x0, и он не будет работать при переключении в 64-битное окно.

Нет HCBT_DEACTIVATE.

1 Ответ

4 голосов
/ 11 июля 2019

Как упомянул @ Реми Лебо, вы можете использовать сообщение WM_ACTIVATE. Это сообщение отправляется, когда окно активировано или деактивировано. Установите хук WH_CALLWNDPROC для захвата деактивированного сообщения, оно получит сообщения до того, как система отправит их в оконную процедуру назначения. Для более подробной информации:

Использование функции в DLL для нелокальной ловушки:

#include <Windows.h>
#include <stdio.h>

LRESULT CALLBACK wndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow) {
    HWND hwnd;
    //...

    DWORD threadID = GetWindowThreadProcessId(hwnd, NULL);
    HINSTANCE hinstDLL = LoadLibrary(TEXT("..\\Debug\\ProcHookDLL.dll"));
    void (*AttachHookProc)(DWORD);
    AttachHookProc = (void (*)(DWORD)) GetProcAddress(hinstDLL, "AttachHook");
    AttachHookProc(threadID);

    MSG msg = {};

    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
    //...
};

Вот код для DLL:

#include <Windows.h>
#include <stdio.h>

HMODULE thisModule;
HHOOK hook;
LRESULT CALLBACK LaunchListener(int nCode, WPARAM wParam, LPARAM lParam);

#ifdef __cplusplus      // If used by C++ code, 
    extern "C" {        // we need to export the C interface
#endif
    __declspec(dllexport) void AttachHook(DWORD threadID) {
        hook = SetWindowsHookEx(WH_CALLWNDPROC, LaunchListener, thisModule, threadID);
    }
#ifdef __cplusplus
}
#endif
    LRESULT CALLBACK LaunchListener(int nCode, WPARAM wParam, LPARAM lParam) {
        // process event here
        if (nCode >= 0) {
            CWPSTRUCT* cwp = (CWPSTRUCT*)lParam;
            if (cwp->message == WM_ACTIVATE) {
                if (LOWORD(cwp->wParam) == WA_INACTIVE)
                {
                    //the window being deactivated
                }
                else
                {
                    //the window being activated
                }
            }
        }
        return CallNextHookEx(NULL, nCode, wParam, lParam);
    }
...