#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
должно быть окно, которое теряет фокус.