WPFでは、ウィンドウを最前面の最上位ウィンドウとしてアクティブ化できます

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のテストツールが付属しています

walterlvのツール

さらに、Shaojunの友人は、多くのwin32メソッドをカプセル化する興味深いライブラリを作成しました。kkwpsvlsjutilを参照してください

おすすめ

転載: www.cnblogs.com/lindexi/p/12749671.html