Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
激活WPF窗口而不丢失对上一个应用程序/窗口的关注_Wpf_Window_Focus - Fatal编程技术网

激活WPF窗口而不丢失对上一个应用程序/窗口的关注

激活WPF窗口而不丢失对上一个应用程序/窗口的关注,wpf,window,focus,Wpf,Window,Focus,我在应用程序中有一个WPF窗口,我通过调用MainView.Activate()在某些特定场景中激活该窗口和MainView.BringIntoView()方法。它还将焦点设置在此“MainView”窗口上 但我的要求是这个窗口不应该获得焦点。i、 e.我的光标仍应保留在以前的应用程序上(记事本、word等) 我尝试使用MainView.ShowActivated=“False”,但没有成功。 我是否需要如上所述使用HwndSource或其他什么 我在Kent的帮助下使用的代码(仅当窗口最小化时

我在应用程序中有一个WPF窗口,我通过调用
MainView.Activate()在某些特定场景中激活该窗口
MainView.BringIntoView()方法。它还将焦点设置在此“MainView”窗口上

但我的要求是这个窗口不应该获得焦点。i、 e.我的光标仍应保留在以前的应用程序上(记事本、word等)

我尝试使用
MainView.ShowActivated=“False”
,但没有成功。 我是否需要如上所述使用HwndSource或其他什么

我在Kent的帮助下使用的代码(仅当窗口最小化时才有效):


在我的示例中,我习惯于在z顺序的前面放置一个窗口,而不给它焦点。我不相信WPF有一种内置的方法可以在不使用p/invoke的情况下实现同样的功能。

我有Win32 helper类用于这种情况,这里列出了您的案例

using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;

namespace your.namespace {
    public static class Win32 {
        public static void ShowWindowNoActive( Window window) {
            var hwnd = (HwndSource.FromVisual(window) as HwndSource).Handle;
            ShowWindow(hwnd, ShowWindowCommands.SW_SHOWNOACTIVATE);
        }

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow);

        private enum ShowWindowCommands : int {
            SW_SHOWNOACTIVATE = 4
        }
    }
}

我需要解决一个类似的问题,并通过设置Window.ShowActivate=false,然后使用Window.Show而不是Window.Activate使其正常工作。也许这对你有用。我还不需要使用BringIntoView,因为我的窗口是新创建的,默认情况下显示在其他窗口的顶部。

我们将要显示的窗口称为“YourWindow”。添加以下代码:

YourWindow.ShowActivated=false

YourWindow.Owner=另一个仍有焦点的窗口


您还可以从XAML设置第一行。

谢谢Kent。但这只有在最小化窗口的情况下才有效。如果窗口是WindowState.Normal并且隐藏在某个应用程序(例如…)后面,则不工作。博客链接已断开。@KentBoogaart链接已断开again@Boumbles,更新了链接。。显然,后面的斜杠是唯一的问题:XAML上的ShowActivated属性工作得很好。我写这篇文章是因为Eli消息上的名称有一个拼写错误,我的窗口是一个通知窗口,不属于当前活动窗口,并且该属性仍然正常工作。如果设置为true,则不会从当前活动窗口中移除焦点。
using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;

namespace your.namespace {
    public static class Win32 {
        public static void ShowWindowNoActive( Window window) {
            var hwnd = (HwndSource.FromVisual(window) as HwndSource).Handle;
            ShowWindow(hwnd, ShowWindowCommands.SW_SHOWNOACTIVATE);
        }

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow);

        private enum ShowWindowCommands : int {
            SW_SHOWNOACTIVATE = 4
        }
    }
}