Pregunta

Estoy utilizando un NotifyIcon de Gana Formas de hacer un icono de la bandeja del sistema para mi aplicación WPF C #.

Tengo un error en el que si el usuario hace clic derecho en el icono del menú de contexto, pueden presionar Alt-F4 y el icono desaparecerá de la bandeja, pero la aplicación principal WPF sigue funcionando. Esto es especialmente un problema cuando se han "minimizado en la bandeja del sistema" y el único control de la aplicación se ha ido.

Alguien sabe cómo manejar esto de modo específico en la bandeja del sistema? He mirado en la documentación NotifyIcon y no hay nada en relación a los eventos de pulsación de teclas.

ACTUALIZACIÓN: he aquí una aplicación de ejemplo para mostrar cómo estoy usando la bandeja del sistema y el error real. http://cid-e75a75f1a1fbfbb5.office .live.com / self.aspx / .public / WpfApplication1.zip? sa = 221089565

¿Fue útil?

Solución 5

Otros consejos

En primer lugar, se puede establecer una ventana de ocultar en el proyecto y que se active en caso contextMenuStrip2_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) si e.alt es cierto.
En segundo lugar se desactiva la ventana de ocultar cierre, puede corregir este error.

por ejemplo:

//public partial class HotKeyWin : Window // WindowStyle="ToolWindow"

public partial class NotifyIconWrapper : Component
{
    private HotKeyWin hkeyWin = new HotKeyWin();

    public NotifyIconWrapper()
    {
         hkeyWin.Show();
         hkeyWin.Closing += new CancelEventHandler(hkeyWin_Closing);                
         hkeyWin.Hide();
    }

    void hkeyWin_Closing(object sender, CancelEventArgs e)
    {
         Console.WriteLine("hkeyWin_Closing enter");
         e.Cancel = true;           
    }

    private void contextMenuStrip2_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
         if (e.Alt) hkeyWin.Activate();
    }
}

Sé que es bastante viejo, pero a medida que fui el mismo tema y como encontré un trabajo razonable cerca de Me alegra compartir aquí.

La solución viene de la PreviewKeyDown evento en el objeto WinForm ContextMenuStrip. Uno se añade este evento, sólo tiene que utilizar el siguiente código de parada de AFT-F4 cerrar sólo el icono (y su menú) en la bandeja.

private void myMenuTray_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    if (e.KeyCode == Keys.Menu && e.KeyValue == 18 && e.Alt)
    {
        MessageBox.Show("");
        MessageBox.Show("YOU CAN'T CLOSE HERE WITH ALT-F4");
        return;
    }
}

Sé que esto parece uggly. Pero funciona bien. Hasta que utilizar algún pregunta de confirmación de aspecto más agradable.

Las explicaciones: en todo caso el ALT-F4 está llegando al objeto de notificación. Al igual que en su código que tiene una primera MessageBox, la ALT-F4 es capturado por este MessageBox que se cierra inmediatamente. El segundo MessageBox se mostró, de ahí el notifique objeto no se está cerrando.

He probado la única return (y no hay e.Cancel de allí), pero cada vez que el objeto Notify es cerrada mientras el resto de la aplicación se encuentra todavía en los procesos en ejecución.

El otro punto bueno es que todavía puede trabajar correctamente con el ALT-F4 estándar para cerrar la aplicación (una vez que no está en la bandeja!).

Bueno, tengo que decir que era un asunto difícil, pero después de algunas pruebas rápida, creo que esto va a hacer.

    private void Form1_Load(object sender, EventArgs e)
    {
        this.Activated += new EventHandler(Form1_Activated);
    }

    void Form1_Activated(object sender, EventArgs e)
    {
        string iconPath = "some file system path";
        notifyIcon1.Icon = new Icon(iconPath);
    }

No va a hacer que sea pues creían que no se puede hacer que el icono dissappear, pero al menos cuando su aplicación obtener el foco, el icono retrun.

También podría intentar almacenar el icono de modo que no es necesario para mantener la construcción de la misma.

supongo que utiliza el NotifyIcon en un WinFormHost? A medida que el NotifyIcon es simplemente un control en el formulario, es probable que tenga que consumir el evento en el formulario principal, y si el MainWindow está oculto, ignora la pulsación de tecla, como (pseudo):

public mainForm_keypressed(object sender, //eventargs
{
  if(_hidden && //Keystroke detection)
  {
    e.Handled = true;
    return;
  }
}

editar

http://www.codeproject.com/KB/WPF/wpf_notifyicon.aspx esto podría mí algo vale la pena analizar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top