注:very similar questionがありますが、WPF固有のものです。この1つではありません。現在のアプリケーションがアクティブになっているかどうかを確認する(フォーカスがある)
現在のアプリケーションがアクティブになっている(つまりフォーカスがある)かどうかを確認するにはどうすればよいですか?
注:very similar questionがありますが、WPF固有のものです。この1つではありません。現在のアプリケーションがアクティブになっているかどうかを確認する(フォーカスがある)
現在のアプリケーションがアクティブになっている(つまりフォーカスがある)かどうかを確認するにはどうすればよいですか?
これは動作します。
/// <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
と一緒に暮らすことができます。
に加入することができる:-)
まずどちらかのハンドルを取得する使用して:
の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();
それはあなたのUIで、いくつかの要素がアクティブ試しするフォームのフォーカスを含んでいる可能性が高いだから。
this.ContainsFocus
WPFでhttp://msdn.microsoft.com/en-us/library/system.windows.forms.control.containsfocus(v=vs.110).aspx
これは、フォームが1つしかない場合(ダイアログボックスなどがない場合)にのみ機能します。 – Cameron
ウィンドウがアクティブであるかどうかを確認する最も簡単な方法は次のとおりです。ネイティブのコールも必要もForm.ActiveForm
をチェックすることですイベントを処理する必要があり、私が見つけ
if(this.IsActive)
{
//the window is active
}
ソリューション。私のテストでは、アプリケーション内のウィンドウがフォーカスされていない場合はnull
、それ以外の場合はnullではありませんでした。
var windowInApplicationIsFocused = Form.ActiveForm != null;
ああ、これはwinformsに固有です。しかし、それは私の状況に当てはまります;-)。
あなたは個人用のWindowsフォームアプリケーションまたは任意のものについて話していますか? – Tigran
このような? http://stackoverflow.com/questions/2183541/c-detecting-which-application-has-focus –
パーソナル - したがって "現在のアプリケーション" ;-) – Cameron