Как я могу определить, есть ли у окна фокус? (Win32 API) - PullRequest
22 голосов
/ 21 января 2009

Используя Win32 API (в C, но это несущественно), как я могу определить, фокусируется ли данное окно (идентифицированное HWND)? Я перехватываю приложение, наблюдающее за событием, и когда это событие происходит, я хочу проверить, фокусируется ли уже приложение. Если это не так, я хочу прошить окно, пока они не сфокусируются на нем.

Альтернативно, имеет ли флаг FlashWindowEx флаг FLASHW_TIMERNOFG, который мигает до тех пор, пока окно не имеет фокус, просто не мигает, если окно уже имеет фокус? Я не могу проверить это сейчас, так как я не в своей среде разработки, но у меня сложилось впечатление, что она все равно будет мигать, чего я и стараюсь избегать.

Редактировать: Также, если это имеет значение, приложение использует DirectX в этом окне.

Ответы [ 4 ]

25 голосов
/ 21 января 2009

GetActiveWindow вернет окно верхнего уровня , связанное с фокусом ввода. GetFocus вернет дескриптор окна с фокусом ввода.

Эта статья может помочь:
http://www.microsoft.com/msj/0397/Win32/Win320397.aspx

15 голосов
/ 04 сентября 2011

Помимо ответа gkrogers с помощью GetActiveWindow, вы также можете поддерживать логическую переменную для окна, которое вы хотите знать, имеет ли оно фокус или нет, перехватывая WM_SETFOCUS и WM_KILLFOCUS события или WM_ACTIVATE

WndProc() ..
case WM_SETFOCUS:
  puts( "Got the focus" ) ;
  break ;

case WM_KILLFOCUS:
  puts( "Lost the focus" ) ;
  break;

case WM_ACTIVATE:
  if( LOWORD(wparam) == WA_ACTIVE )
    puts( "MEGAZORD ACTIVATED kew kew kew (flashy-eyes)" ) ;
  else 
    puts( "I AM NOW INACTIVE." ) ;
  break ;
7 голосов
/ 21 января 2009

Вы действительно имеете в виду «фокус» или «активный»?

Одно окно имеет фокус - то, которое первым в очереди, чтобы получить события клавиатуры. Внешнее окно (которое пользователь может перетаскивать по экрану) является «активным», если одно из его подокон имеет фокус, но может иметь или не иметь сам фокус.

4 голосов
/ 08 октября 2013

Используйте функцию GetForegroundWindow, чтобы получить Hwnd, на который вы сейчас фокусируете. Тогда вам просто нужно сравнить его с окном вашего приложения, чтобы проверить, содержит ли оно фокус или нет.

...