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

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

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


person Mark Ingram    schedule 04.02.2009    source источник


Ответы (5)


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

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

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

В остальном все персиковое :-)

person Bob Moore    schedule 04.02.2009

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

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

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

person towry    schedule 10.09.2012
comment
Я не занимался разработкой материалов MSDN в течение многих лет, поэтому этот ответ может быть неверным. - person towry; 23.10.2020

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

person lakshmanaraj    schedule 04.02.2009

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

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

Вместо этого используйте GetFocus ().

person Stefan    schedule 04.02.2009
comment
Это неверно: GetFocus возвращает окно с фокусом клавиатуры для очереди сообщений текущего потока. [...] Используйте функцию GetForegroundWindow, чтобы получить дескриптор окна, с которым в данный момент работает пользователь. - person Martin Plante; 04.02.2009
comment
Как я уже сказал: если вы имеете в виду окно с фокусом ввода. - person Stefan; 04.02.2009
comment
GetFocus работает только с очередью сообщений текущего потока, вот что я имел в виду. GetForegroundWindow - это API для вызова, и его название вводит в заблуждение. Это окно может не быть самым верхним в z-порядке, но оно возвращает окно, имеющее глобальный фокус. т.е. активен. - person Martin Plante; 08.02.2009

Да, 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;
person mkesc    schedule 09.09.2016