Подтвердить что ты не робот

Как определить, имеет ли фокус окно? (Win32 API)

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

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

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

4b9b3361

Ответ 2

Помимо ответа 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 ;

Ответ 3

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

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

Ответ 4

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

Ответ 5

Для нескольких немодальных детей: Внутри Ребенка вы можете сохранить фокус, 13.08.19 VS2017. Вы можете сохранить фокус, чтобы родитель знал, на какого немодального ребенка щелкнули.

В обработчике обратного вызова childs:

case WM_CHILDACTIVATE: //only gets called when the child border is click on.
    //CurrentFocus = hDlg; //example : can save the focus globally for parent usage.
    //Beep(2000, 250); // so you can test
break;

case WM_GETMINMAXINFO: //gets called when child window is being moved or sized.
        //Beep(2000, 250);
break;

case WM_LBUTTONDOWN:  //Only called when cursor is inside the child client area
    //CurrentFocus = hDlg; // following the focus.
    //Beep(2000, 250);
break;