21


7

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

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

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

4 Answer


25


http://msdn.microsoft.com/ja-jp/library/ms646292(VS.85).aspx[GetActiveWindow]は、入力フォーカスに関連付けられている_top-level_ウィンドウを返します。  http://msdn.microsoft.com/ja-jp/library/ms646294(VS.85).aspx[GetFocus]は、入力フォーカスがあるウィンドウのハンドルを返します。

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


14


gkrogersはGetActiveWindowを使って答えるだけでなく、http://msdn.microsoft.com/ja-jp/library/ms646283(VS.85をトラップして、フォーカスがあるかどうかを知りたいウィンドウのブール変数を管理することもできます。 ).aspx [WM_SETFOCUS]およびhttp://msdn.microsoft.com/en-us/library/ms646282(VS.85).aspx [` WM_KILLFOCUS`]イベント、またはhttp://msdn.microsoft.com / ja-jp / library / ms646274(VS.85).aspx [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


あなたは本当に "集中"を意味しますか、それとも "アクティブ"を意味しますか?

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


4


今注目しているHwndを取得するには、GetForegroundWindow関数を使用します。 次に、それをアプリケーションのウィンドウと比較して、フォーカスが含まれているかどうかを確認するだけです。