WPFでコードコントロールを使用する場合は、ウィンドウを現在のユーザーの入力の論理フォーカスウィンドウ、つまり現在のユーザーのアクティブウィンドウの最上位ウィンドウにします。既定では、Activateメソッドが使用されます。デバイスはアクティベーションウィンドウを実行できます
ただし、一部の特殊なデバイスでは、次のコードを使用してウィンドウを呼び出すと、ウィンドウを最上位に配置せずに、タスクバーのアイコンが点滅するだけです。
window.Show();
window.Activate();
ほとんどのデバイスでは、ShowとActivateの組み合わせにより、現在のユーザーとしてウィンドウをアクティブにすることができます。ウィンドウが最小化または非表示になっていても、Showメソッドで表示できます。
ただし、一部のデバイスウィンドウは他のウィンドウの下に隠れており、このときのウィンドウのwindow.IsActiveはまだtrueですが、Activateを呼び出してもウィンドウは上位層に配置されません
多くの友人がインターネットでSetForegroundWindowメソッドを呼び出しているのを見ました。実際、WPFは現在オープンソースです。WindowのActivateメソッドが次のように記述されていることがわかります。
public bool Activate()
{
// this call ends up throwing an exception if Activate
// is not allowed
VerifyApiSupported();
VerifyContextAndObjectState();
VerifyHwndCreateShowState();
// Adding check for IsCompositionTargetInvalid
if (IsSourceWindowNull || IsCompositionTargetInvalid)
{
return false;
}
return UnsafeNativeMethods.SetForegroundWindow(new HandleRef(null, CriticalHandle));
}
ソースコードはgithubをご覧ください
つまり、SetForegroundWindowの呼び出しは、Activateメソッドの呼び出しに似ています。Activateを呼び出す場合は、SetForegroundWindowを呼び出す必要があります。
巨人のSetForegroundWindow-Subdock-Blog Gardenを正しく使用すると、次の手順に従う必要があることが理解できます。
1.得到窗口句柄FindWindow
2.切换键盘输入焦点AttachThreadInput
3.显示窗口ShowWindow(有些窗口被最小化/隐藏了)
4.更改窗口的Zorder,SetWindowPos使之最上,为了不影响后续窗口的Zorder,改完之后,再还原
5.最后SetForegroundWindow
WPFでウィンドウを変更する対応する順序はTopmostプロパティを使用し、順序を設定するには特定の小さな変更が必要です
よるWPFでC#の-にウィンドウを持参 WPFでフロント-スタックオーバーフローは、 メソッドのAttachThreadInputを使用する方法を学ぶことができます
コード全体を以下に示します。特定のwin32メソッドを記述していません。お友達が追加してください
private static void SetWindowToForegroundWithAttachThreadInput(Window window)
{
var interopHelper = new WindowInteropHelper(window);
var thisWindowThreadId = Win32.User32.GetWindowThreadProcessId(interopHelper.Handle, IntPtr.Zero);
var currentForegroundWindow = Win32.User32.GetForegroundWindow();
var currentForegroundWindowThreadId = Win32.User32.GetWindowThreadProcessId(currentForegroundWindow, IntPtr.Zero);
// [c# - Bring a window to the front in WPF - Stack Overflow](https://stackoverflow.com/questions/257587/bring-a-window-to-the-front-in-wpf )
// [SetForegroundWindow的正确用法 - 子坞 - 博客园](https://www.cnblogs.com/ziwuge/archive/2012/01/06/2315342.html )
/*
1.得到窗口句柄FindWindow
2.切换键盘输入焦点AttachThreadInput
3.显示窗口ShowWindow(有些窗口被最小化/隐藏了)
4.更改窗口的Zorder,SetWindowPos使之最上,为了不影响后续窗口的Zorder,改完之后,再还原
5.最后SetForegroundWindow
*/
Win32.User32.AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, true);
window.Show();
window.Activate();
// 去掉和其他线程的输入链接
Win32.User32.AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, false);
// 用于踢掉其他的在上层的窗口
window.Topmost = true;
window.Topmost = false;
上層にウィンドウがないデバイスをいくつかテストしました。上記のコードを使用して設定できますが、上記のコードを設定するために考えられるピットは何なのかわかりません。
現在のGetForegroundWindowを取得するために使用できるwalterlvのテストツールが付属しています
さらに、Shaojunの友人は、多くのwin32メソッドをカプセル化する興味深いライブラリを作成しました。kkwpsvlsjutilを参照してください