ALT-TAB始终使用多个拥有的窗口激活WPF应用程序中的主窗口

时间:2013-05-21 12:59:19

标签: wpf focus multi-window

在Windows 7,.NET 4.0上,我有一个问题可以通过将以下代码复制到Visual Studio生成的空白WPF应用程序中来重现:

    public MainWindow()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(MainWindow_Loaded);
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        new Window() { Title = "Test", ShowInTaskbar = false, Owner = this }.Show();
    }
  1. 运行应用
  2. 激活辅助窗口
  3. Alt-Tab到其他正在运行的应用程序
  4. 使用鼠标在任务栏中激活我们的WPF应用程序
  5. 现在WPF应用程序再次处于活动状态,辅助窗口已激活且主窗口已停用,这是预期的(和期望的)行为。

    现在改为执行此操作(仅第4步不同):

    1. 运行应用
    2. 激活辅助窗口
    3. Alt-Tab到其他正在运行的应用程序
    4. Alt-Tab返回我们的WPF应用
    5. WPF应用程序再次处于活动状态,但现在主窗口已激活。 添加此代码

      private void Application_Activated(object sender, EventArgs e)
      {
          Windows[1].Activate();
      }
      

      到App.xaml.cs并没有解决问题,因为现在在第二种情况下两个窗口都被激活了。此外,单击辅助窗口不会取消激活主窗口。我必须再次单击(已激活的)主窗口和辅助窗口来实现此目的。

      如何避免这种情况(在这两种情况下只应激活辅助窗口?)

2 个答案:

答案 0 :(得分:1)

CodeProject实际上解决了这个问题here,希望这是您正在寻找的。

post from Tamil Khason结合使用,理论上你可以在全局级别覆盖OnFocus事件,这样每次窗口聚焦时,它就会成为“主窗口”,然后它将成为ALT +的目标TAB。

答案 1 :(得分:0)

基于THIS解决方案,以下代码可能(未经过测试喷射)也可以做到这一点

  protected override void OnStartup(StartupEventArgs e)
            {
                EventManager.RegisterClassHandler(typeof(Window), Window.LoadedEvent, new RoutedEventHandler(WindowLoaded));

                base.OnStartup(e);
            }

    void WindowLoaded(object sender, RoutedEventArgs e)
            {
                Window w = sender as Window;
                if (w != null)
                {
                   // this part works in my case very well
                    w.Owner =Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);
                }
            }
相关问题