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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

Да, 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;