31

Win32 API を使用して (C では、それは重要ではありません)、特定のウィンドウ (HWND によって識別される) にフォーカスがあるかどうかをどのように確認できますか?

イベントを監視しているアプリケーションをフックしています。そのイベントが発生したときに、アプリケーションに既にフォーカスがあるかどうかを確認したいと考えています。そうでない場合は、ウィンドウにフォーカスが移るまでウィンドウをフラッシュしたいと思います。

あるいは、FlashWindowEx 構造体フラグ FLASHW_TIMERNOFG は、ウィンドウにフォーカスがある場合、ウィンドウにフォーカスがあるまで点滅しませんか?

私は自分の開発環境にいないため、これをテストすることはできませんが、とにかくフラッシュするという印象を受けました。これは避けようとしていることです。

また、問題があれば、アプリケーションはこのウィンドウで DirectX を使用します。

4

5 に答える 5

32

GetActiveWindowは、入力フォーカスに関連付けられている最上位ウィンドウを返します。GetFocusは、入力フォーカスを持つウィンドウのハンドルを返します。

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

于 2009-01-21T18:08:23.493 に答える
18

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_INACTIVE )
    puts( "I AM NOW INACTIVE." ) ;
  else // WA_ACTIVE or WA_CLICKACTIVE
    puts( "MEGAZORD ACTIVATED kew kew kew (flashy-eyes)" ) ;
  break ;
于 2011-09-04T19:11:03.017 に答える
9

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

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

于 2009-01-21T18:05:41.300 に答える
4

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

于 2013-10-08T17:53:18.863 に答える