Как отличить, активируется ли окно щелчком мыши?

#c #winapi

Вопрос:

В настоящее время я подключаю активации окон со следующим кодом:

 extern "C" __declspec(dllexport) LRESULT CALLBACK CBTProc(
    _In_ int    nCode,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)
{
    if (nCode < 0) return CallNextHookEx(nullptr, nCode, wParam, lParam);

    HWND hwnd      = reinterpret_cast<HWND>(wParam);

    switch (nCode)
    {
    case HCBT_ACTIVATE: // The system is about to activate a window.
    {
        return 0; // 0 - Allow 1 - Deny
    }
    }
    return 0;
 

Из документов:

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms644977(v=против 85)

lParam
Указывает длинный указатель на структуру CBTACTIVATESTRUCT, содержащую дескриптор активного окна, и указывает, изменяется ли активация из-за щелчка мыши.

Как я мог бы интерпретировать значение lParam и отличить его?

Ответ №1:

Как говорится в документации, для HCBT_ACTIVATE lParam указывает указатель на a CBTACTIVATESTRUCT , поэтому просто наберите его соответствующим образом, так же , как вы делаете с wParam , например:

 extern "C" __declspec(dllexport) LRESULT CALLBACK CBTProc(
    _In_ int    nCode,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)
{
    if (nCode < 0) return CallNextHookEx(nullptr, nCode, wParam, lParam);

    switch (nCode)
    {
        case HCBT_ACTIVATE: // The system is about to activate a window.
        {
            HWND hwnd = reinterpret_cast<HWND>(wParam);
            CBTACTIVATESTRUCT* cbt = reinterpret_cast<CBTACTIVATESTRUCT*>(lParam);
            // use hwnd, cbt->fMouse, and cbt->hWndActive as needed...
            return 0; // 0 - Allow 1 - Deny
        }
    }
    return 0;
}
 

Комментарии:

1. При активации окна щелчком на панели cbt->fMouse задач возвращает 0,. Основная причина, по которой я сейчас подключаюсь HCBT_ACTIVATE , заключается в том, чтобы определить, когда окно активируется другим окном, свернутым над ним, знаете ли вы, как я мог бы его отличить?

2. @Razec Кнопка на панели задач представляет собой окно, но не является фактическим окном. Активация окна с помощью мыши означает щелчок по самому окну. AFAIK, нет способа определить, активируется ли окно панелью задач. Но cbt->hWndActive должно быть окно, которое теряет фокус.