2010-12-10 14 views
22

私が開発しているデスクトップアプリケーションは、アプリケーションの実行中にどのウィンドウがアクティブであるかを知る必要があります。現在は、コール(user32.dll)を250ミリ秒ごとに実行します。このアプローチはあまり正確ではありません。アクティブなウィンドウのWindowsシステムイベントが変更されましたか?

アクティブ(フォーカス)ウィンドウが変更されるたびに起動するWindows(WINAPI?)イベントはありますか?私は私のコールバック関数を購読したいと思います。

ありがとうございました。

+2

非常に良い答えがここにあります:http://stackoverflow.com/a/11943387/134761 – angularsen

答えて

28

はい、SetWinEventHook機能を使用できます。

hEvent = SetWinEventHook(EVENT_SYSTEM_FOREGROUND , 
    EVENT_SYSTEM_FOREGROUND , NULL, 
    WinEventProcCallback, 0, 0, 
    WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); 

....... 

VOID CALLBACK WinEventProcCallback (HWINEVENTHOOK hWinEventHook, DWORD dwEvent, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime) 
{ 
    /* your code here */ 
} 
+1

これは私が探していたものです。私はそれをチェックさせてください。 –

+0

私はEVENT_SYSTEM_FOREGROUNDを試したことはありませんが、SetWinEventHookを使ってウィンドウの位置を変更するEVENT_OBJECT_LOCATIONCHANGEイベントをフックしてくれました。 – DReJ

+6

なぜC#の質問に対するC/C++の答えがありますか? – Chris

2

WM_ACTIVATE messageがあります。これは、有効化または無効化されたウィンドウに送信されます。

+5

これは私が探しているものではありません。システム内のすべてのウィンドウを購読するのは無理です。 :) –

+0

@Vasiliy Borovyak:ああ、決して気にしない - 私はあなたが特定のウィンドウのアクティブな状態だけを必要としていると思って誤解しています。 – Piskvor

関連する問題