web-dev-qa-db-ja.com

ウィンドウにフォーカスがあるかどうかを確認するにはどうすればよいですか? (Win32 API)

Win32 API(Cでは重要ではありませんが)を使用して、特定のウィンドウ(HWNDで識別)にフォーカスがあるかどうかを確認するにはどうすればよいですか?イベントを監視しているアプリケーションをフックしています。そのイベントが発生したときに、アプリケーションにすでにフォーカスがあるかどうかを確認したいと思います。そうでない場合、私は彼らがそれにフォーカスを与えるまでウィンドウをフラッシュしたいと思います。

あるいは、ウィンドウにフォーカスがあるまで点滅するFlashWindowEx構造体フラグFLASHW_TIMERNOFGは、ウィンドウに既にフォーカスがある場合は点滅しないのですか?私は自分の開発環境にいないので、これをテストすることはできませんが、とにかく点滅するという印象を受けました。これは回避しようとしていることです。

編集:また、問題がある場合、アプリケーションはこのウィンドウでDirectXを使用します。

23
Daniel Jennings

GetActiveWindow は、入力フォーカスに関連付けられているトップレベルウィンドウを返します。 GetFocus は、入力フォーカスがあるウィンドウのハンドルを返します。

この記事は役立つかもしれません:
http://www.Microsoft.com/msj/0397/Win32/Win320397.aspx

25
gkrogers

GetActiveWindowを使用してgkrogersが応答することに加えて、- 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 ;
15
bobobobo

あなたは本当に「フォーカス」を意味しますか、それとも「アクティブ」を意味しますか?

1つのウィンドウにフォーカスがあります-キーボードイベントを取得するための最初のウィンドウです。外側のウィンドウ(ユーザーが画面上でドラッグできる)は、そのサブウィンドウの1つにフォーカスがある場合は「アクティブ」ですが、フォーカスがある場合とない場合があります。

7
Jason Cohen

GetForegroundWindow関数を使用して、現在フォーカスしているHwndを取得します。次に、それをアプリケーションのウィンドウと比較して、フォーカスが含まれているかどうかを確認する必要があります。

4
user2133061

複数のモードレスの子の場合:子内でフォーカスを保存できます(13/08/19 VS2017)。フォーカスを保存して、親がクリックしたモードレスの子がわかるようにすることができます。

チャイルズコールバックハンドラー:

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;
0
user11910606