Отключение Alt-F4 в Win Forms NotifyIcon - PullRequest
2 голосов
/ 17 июня 2010

Я использую NotifyIcon из Win Forms для создания значка systray для моего приложения WPF C #.

У меня ошибка, когда пользователь щелкает правой кнопкой мыши значок контекстного меню, он может нажать Alt-F4, и значок исчезнет из области уведомлений, но приложение Main WPF все еще работает. Это особенно проблема, когда они «свернуты в systray» и теперь единственный контроль над приложением ушел.

Кто-нибудь знает, как конкретно справиться с этим на systray? Я посмотрел документацию NotifyIcon, и ничего не связано с событиями нажатия клавиш.

ОБНОВЛЕНИЕ: вот пример приложения, чтобы показать, как я использую systray и фактическую ошибку. http://cid -e75a75f1a1fbfbb5.office.live.com / self.aspx / .Public / WpfApplication1.zip? Са = 221089565

Ответы [ 5 ]

1 голос
/ 21 октября 2017

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

Решение приходит из события PreviewKeyDown в WinFormОбъект ContextMenuStrip.Как только вы добавили это событие, просто используйте следующий код, чтобы остановить AFT-F4, закрывая только значок (и его меню) в трее.

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;
    }
}

Я знаю, это выглядит ужасно.Но это работает отлично.Вы можете использовать какой-нибудь вопрос подтверждения, чтобы выглядеть лучше.

Пояснения: в любом случае ALT-F4 прибывает на объект уведомления.Так как в вашем коде у вас есть 1-й MessageBox, ALT-F4 захватывается этим MessageBox, который немедленно закрывается.2-й MessageBox показан, следовательно, объект уведомления не закрывается.

Я протестировал один return (и там нет e.Cancel), но каждый раз объект уведомлениязакрыто, пока остальная часть приложения все еще находится в запущенных процессах.

Другой хороший момент заключается в том, что вы все еще можете правильно работать со стандартным ALT-F4, чтобы закрыть приложение (если его нет в трее!)

1 голос
/ 29 ноября 2010

Во-первых, вы можете установить окно скрытия в проекте и активировать его в событии contextMenuStrip2_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e), если e.alt имеет значение true.
Во-вторых, вы отключаете закрытие окна закрытия, можете исправить эту ошибку.

например:

//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();
    }
}
0 голосов
/ 17 июня 2010

Ну, я должен сказать, что это было сложно, но после некоторого быстрого тестирования, я думаю, что это подойдет.

    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);
    }

Это не сделает так, что вы не сможете заставить значок исчезнуть, но, по крайней мере, когда ваше приложение сфокусируется, значок будет повторен.

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

0 голосов
/ 27 июля 2010

Так что это ошибка, и я сообщил об этом в Microsoft Connect. Проверьте здесь обновления, я полагаю: https://connect.microsoft.com/VisualStudio/feedback/details/568590/unable-to-disable-alt-f4-on-winforms-notifyicon-when-context-menu-is-open?wa=wsignin1.0

0 голосов
/ 17 июня 2010

Я полагаю, вы используете NotifyIcon в WinFormHost?Поскольку NotifyIcon - это просто элемент управления в форме, вам, вероятно, придется использовать событие в главной форме, а если главное окно скрыто, игнорируйте нажатие клавиши, например (псевдо):

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

edit

http://www.codeproject.com/KB/WPF/wpf_notifyicon.aspx это может быть чем-то, на что стоит обратить внимание.

...