2011-08-23 18 views
35

注:very similar questionがありますが、WPF固有のものです。この1つではありません。現在のアプリケーションがアクティブになっているかどうかを確認する(フォーカスがある)

現在のアプリケーションがアクティブになっている(つまりフォーカスがある)かどうかを確認するにはどうすればよいですか?

+0

あなたは個人用のWindowsフォームアプリケーションまたは任意のものについて話していますか? – Tigran

+0

このような? http://stackoverflow.com/questions/2183541/c-detecting-which-application-has-focus –

+0

パーソナル - したがって "現在のアプリケーション" ;-) – Cameron

答えて

61

これは動作します。

/// <summary>Returns true if the current application has focus, false otherwise</summary> 
public static bool ApplicationIsActivated() 
{ 
    var activatedHandle = GetForegroundWindow(); 
    if (activatedHandle == IntPtr.Zero) { 
     return false;  // No window is currently activated 
    } 

    var procId = Process.GetCurrentProcess().Id; 
    int activeProcId; 
    GetWindowThreadProcessId(activatedHandle, out activeProcId); 

    return activeProcId == procId; 
} 


[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 
private static extern IntPtr GetForegroundWindow(); 

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
private static extern int GetWindowThreadProcessId(IntPtr handle, out int processId); 

、メインフォーム(またはハンドル)を必要としない、スレッドセーフであるという利点を有しており、WPFまたはリサイズ特異的ではありません。子ウィンドウ(独立したスレッドで作成された独立したウィンドウも)で動作します。また、ゼロ設定が必要です。

欠点は、少しP /呼び出しを使用していることですが、私はあなたがあなたのメインアプリケーションフォームのActivated eventハンドルMain Window's Activated event

+0

これは子ウィンドウでは機能しますが、それらとその親とは区別されません。 – Chris

+2

@Chris:はい、それがポイントです。子ウィンドウは依然としてアプリケーションの一部です。私は '現在のアプリケーション'によって、私は本当に '現在のプロセス'を意味すると思います。 – Cameron

3

と一緒に暮らすことができます。

1

に加入することができる:-)

0

まずどちらかのハンドルを取得する使用して:

のIntPtr myWindowHandleを。

myWindowHandle = new WindowInteropHelper(Application.Current.MainWindow).Handle; 

または

HwndSource source = (HwndSource)HwndSource.FromVisual(this); 
myWindowHandle = source.Handle; 

そして、それはForeGroundWindowあるwhethersを比較:

if (myWindowHandle == GetForegroundWindow()) 
{ 
    // Do stuff! 

} 

[DllImport("user32.dll")] 
private static extern IntPtr GetForegroundWindow(); 
+0

子ウィンドウがフォアグラウンドウィンドウの場合はどうなりますか?アプリケーションにはまだフォーカスがありますが、メインウィンドウはありません。 – Cameron

+0

@cameron、確かにあなたはそれほど多くのことを考え出しました。しかし、悲しいことに、悲しいことに、他の提案された答えにも批判が適用されませんか? – Cilvic

+0

私は誰も投票しなかったが、メインウィンドウが他のすべての親(または祖父母)である限り、「アクティブ化された」回答は機能します。 – Cameron

0

ウィンドウがアクティブであるかどうかを確認する最も簡単な方法は次のとおりです。ネイティブのコールも必要もForm.ActiveFormをチェックすることですイベントを処理する必要があり、私が見つけ

if(this.IsActive) 
{ 
//the window is active 
} 
1

ソリューション。私のテストでは、アプリケーション内のウィンドウがフォーカスされていない場合はnull、それ以外の場合はnullではありませんでした。

var windowInApplicationIsFocused = Form.ActiveForm != null; 

ああ、これはwinformsに固有です。しかし、それは私の状況に当てはまります;-)。

関連する問題