Как определить, является ли текущее окно активным? - PullRequest
10 голосов
/ 04 февраля 2009

Как узнать, является ли мое окно текущим активным окном? Мое текущее предположение - сделать GetForegroundWindow и сравнить HWND с моим окном. Есть ли лучший метод, чем это?

Я использую Win32 API / MFC.

Ответы [ 5 ]

11 голосов
/ 04 февраля 2009

Да, это единственный способ, который я знаю.

Но вы должны учитывать тот факт, что GFW может вернуть NULL. Как правило, это происходит, когда активен другой рабочий стол (например, рабочий стол с заставкой). Обратите внимание, что использование пароля заставки может повлиять на использование другого рабочего стола (это зависит от версии Windows, и я не могу вспомнить подробности того, как работают разные версии).

Также этот код не будет работать должным образом в режиме отладки в Visual Studio, потому что вы получите дескриптор окна VS.

Кроме этого все персиковое: -)

1 голос
/ 10 сентября 2012

Вы можете попробовать использовать сообщение WM_ACTIVATEAPP.
Сначала определите переменную bool bool wActive = false, в процедуре WndProc вот следующий фрагмент кода:

case WM_ACTIVATEAPP:
     wActive = (bool)wParam;
return 0;

Вы можете перейти на MSDN , чтобы найти больше информации о WM_ACTIVATEAPP

1 голос
/ 04 февраля 2009

Я предполагаю, что вы имеете в виду окно с фокусом ввода, когда говорите "активное окно"?

В этом случае забудьте API GetForegroundWindow (). Это вернет самое верхнее окно - не всегда окно с фокусом ввода.

Используйте взамен GetFocus () .

1 голос
/ 04 февраля 2009

Да, вы правы, если не хотите проверять активное окно каждого потока.

0 голосов
/ 09 сентября 2016

Да, GetForgroundWindow () - это хороший способ проверки, он корректно работает даже с окном «Всегда сверху», также известным как HWND_TOPMOST.

Другой способ - с помощью GetActiveWindow ()

    HWND temp = GetActiveWindow();
    if (temp == hWnd) // Then your current window has focus

В качестве альтернативы следующие сообщения сообщают, если фокус изменился

    case WM_KILLFOCUS:
        // windowHasFocus = false
    break;

    case WM_SETFOCUS:
        // windowHasFocus = true;
    break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...