Обеспечение того, чтобы окно WPF всегда было сверху, даже когда пользователь нажимает на другое развернутое приложение - PullRequest
3 голосов
/ 12 марта 2010

Я пытаюсь убедиться, что мое окно WPF остается открытым, пока оно открыто. Он действует как всплывающее окно с TopMost = true и вызовом win32 SetWindowPos для TOPMOST. При первом открытии оно отображается поверх другого запущенного приложения на рабочем столе - развернуто или нет.

Если пользователь активирует или использует окно в моем приложении, оно теряет фокус и исчезает.

Я думал о том, чтобы манипулировать другим окном приложения, установить для него более низкий индекс z. Как мне найти окно приложения? Как мне перебрать все окна? (Этот вопрос остается в силе, даже если это неправильный подход).

Я бы использовал SetWindowPos, GetForegroundWindow, GetForegroundWindow, GetDesktopWindow и так далее.

Я подозреваю, что как только пользователь нажмет на свое приложение, оно все равно будет фокусироваться, и я лаю не на том дереве.

В настоящее время мое приложение является черным ящиком, и я не могу справиться с ним иначе, например, периодически отправлять мое приложение для фокусировки.

Я также думал о том, чтобы иметь длительный фоновый поток, который периодически фокусирует мое всплывающее окно WPF, но мне нужно следить за ресурсами и процессором.

С уважением,

1 Ответ

0 голосов
/ 23 марта 2010

Попробуйте этот подход:


   public partial class Window1 : System.Windows.Window
   {
      private System.Windows.Forms.NotifyIcon trayNotifyIcon;
      private System.Windows.Forms.ContextMenuStrip contextMenuStrip;
      private System.Windows.Forms.ToolStripMenuItem exitMenu;
      private bool isAppExiting = false;



      public Window1()
      {        
         InitializeComponent();    

         this.Topmost = true;
         //Create an instance of the NotifyIcon Class
         trayNotifyIcon = new System.Windows.Forms.NotifyIcon();

         // This icon file needs to be in the bin folder of the application
         trayNotifyIcon.Icon = Properties.Resources.MagicRoler_Application;

         //show the Tray Notify Icon
         trayNotifyIcon.Visible = true;
         trayNotifyIcon.DoubleClick += new EventHandler(trayNotifyIcon_DoubleClick);

         //Create a object for the context menu
         contextMenuStrip = new System.Windows.Forms.ContextMenuStrip();

         //Add the Menu Item to the context menu
         System.Windows.Forms.ToolStripMenuItem mnuExit = new System.Windows.Forms.ToolStripMenuItem();
         mnuExit.Text = "Exit";
         mnuExit.Click += new EventHandler(mnuExit_Click);
         contextMenuStrip.Items.Add(mnuExit);

         //Add the Context menu to the Notify Icon Object
         trayNotifyIcon.ContextMenuStrip = contextMenuStrip;



      }    




       void mnuExit_Click(object sender, EventArgs e)
        {
            isAppExiting = true;
            this.Close();
            trayNotifyIcon.Visible = false;
        } 

       private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            //When the application is closed, check wether the application is 
            //exiting from menu or forms close button
            if (!isAppExiting)
            {
                //if the forms close button is triggered, cancel the event and hide the form
                //then show the notification ballon tip
                e.Cancel = true;
                this.Hide();
                trayNotifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
                trayNotifyIcon.BalloonTipTitle = "Application";
                trayNotifyIcon.BalloonTipText = "Application is accessible through System Tray";
                trayNotifyIcon.ShowBalloonTip(400);
            }
        }

       private void Window_StateChanged(object sender, EventArgs e)
       {
          switch (this.WindowState)
          {
             case WindowState.Maximized:               
                this.Visibility = Visibility.Visible;               
                break;
             case WindowState.Normal:
                this.Visibility = Visibility.Visible;               
                break;
             case WindowState.Minimized:
                this.WindowState = WindowState.Normal;
                this.Visibility = Visibility.Hidden;                
                break;
          } 
       }

       void trayNotifyIcon_DoubleClick(object sender, EventArgs e)
       {
          switch (this.Visibility)
          {
             case Visibility.Collapsed:
             case Visibility.Hidden:
                this.Visibility = Visibility.Visible;               
                break;
             case Visibility.Visible:
                this.Visibility = Visibility.Hidden;               
                break;
          }
       }


   }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...