Как я могу узнать, является ли мое окно текущим активным окном? Сейчас я предполагаю сделать GetForegroundWindow и сравнить HWND с таковым в моем окне. Есть ли лучший метод, чем этот?
Я использую Win32 API / MFC.
Как я могу узнать, является ли мое окно текущим активным окном? Сейчас я предполагаю сделать GetForegroundWindow и сравнить HWND с таковым в моем окне. Есть ли лучший метод, чем этот?
Я использую Win32 API / MFC.
Да, это единственный способ, о котором я знаю.
Но вы должны учитывать тот факт, что GFW может возвращать NULL. Обычно это происходит, когда активен другой рабочий стол (например, рабочий стол заставки). Обратите внимание, что использование пароля заставки может повлиять на использование другого рабочего стола (это зависит от версии Windows, и я не могу вспомнить подробности того, как работают разные версии).
Также этот код не будет работать должным образом в режиме отладки в Visual Studio, потому что вы получите дескриптор окна VS.
В остальном все персиковое :-)
Вы можете попробовать использовать сообщение WM_ACTIVATEAPP.
Сначала определите логическую переменную bool wActive = false в процедуре WndProc, вот следующий фрагмент кода:
case WM_ACTIVATEAPP:
wActive = (bool)wParam;
return 0;
Вы можете перейти на MSDN, чтобы найти дополнительную информацию о WM_ACTIVATEAPP
Да, вы правы, если в противном случае вы не хотите проверять активное окно каждого потока.
Я предполагаю, что вы имеете в виду окно с фокусом ввода, когда вы говорите «активное окно»?
В этом случае забудьте об API GetForegroundWindow (). Это вернет самое верхнее окно - не всегда окно с фокусом ввода.
Вместо этого используйте GetFocus ().
Да, 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;