2

我正在使用 Win Forms 中的 NotifyIcon 为我的 WPF C# 应用程序制作系统托盘图标。

我有一个错误,如果用户右键单击上下文菜单的图标,他们可以按 Alt-F4 并且图标将从托盘中消失,但主 WPF 应用程序仍在运行。当他们“最小化到系统托盘”并且应用程序的唯一控制现在消失时,这尤其是一个问题。

任何人都知道如何在系统托盘上专门处理这个问题?我查看了 NotifyIcon 文档,没有任何与按键事件相关的内容。

更新:这是一个示例应用程序,展示了我如何使用系统托盘和实际的错误。http://cid-e75a75f1a1fbfbb5.office.live.com/self.aspx/.Public/WpfApplication1.zip?sa=221089565

4

5 回答 5

1

首先,您可以在项目中设置一个隐藏窗口,如果为真,则在contextMenuStrip2_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)事件中激活它。 其次,您禁用隐藏窗口关闭,可以修复此错误。e.alt

例如:

//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();
    }
}
于 2010-11-29T07:28:08.007 回答
1

我知道它已经很老了,但是当我遇到同样的问题并且我发现了一些合理的工作时,我很高兴在这里分享。

解决方案来自PreviewKeyDownWinForm 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都会到达通知对象。在您的代码中,您有一个 1st MessageBox,它被立即关闭ALT-F4的 this 捕获。MessageBox显示第二个MessageBox,因此通知对象没有关闭。

我已经测试了单曲return(里面没有e.Cancel),但是每次通知对象关闭时,应用程序的其余部分仍在运行的进程中。

另一个好处是您仍然可以正常使用标准ALT-F4来关闭应用程序(一旦它不在托盘中!)。

于 2017-10-21T12:05:37.250 回答
0

我猜你在 WinFormHost 中使用 NotifyIcon?由于 NotifyIcon 只是窗体上的一个控件,因此您可能必须在主窗体中使用该事件,如果主窗口被隐藏,则忽略击键,例如(伪):

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

编辑

http://www.codeproject.com/KB/WPF/wpf_notifyicon.aspx这可能是我值得研究的东西。

于 2010-06-17T16:18:19.757 回答
0

好吧,我得说这是一个棘手的问题,但经过一些快速测试后,我认为这可以做到。

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

它不会让你不能让图标消失,但至少当你的应用程序获得焦点时,图标会重新运行。

您也可以尝试存储图标,这样您就不需要继续构建它。

于 2010-06-17T16:40:00.030 回答
0

所以这是一个错误,我已将其报告给 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

于 2010-07-27T17:57:16.447 回答