You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WPF中点击托盘通知后首次右键无法打开上下文菜单求助

问题解决:点击Toast通知后托盘图标首次右键无响应

问题原因

点击通知气泡后,系统会将焦点转移到通知中心的后台窗口,此时托盘图标的MouseDown事件会被系统拦截,首次右键操作实际是将焦点重新转移到应用相关窗口,而非触发事件。

解决方案

1. 调整通知气泡点击事件,抢回应用焦点

修改NotifyIcon_BalloonTipClicked方法,确保主窗口激活并获取焦点,避免焦点滞留在系统通知窗口:

private void NotifyIcon_BalloonTipClicked(object sender, EventArgs e)
{
    Show();
    WindowState = m_storedWindowState;
    // 激活主窗口并强制设置为前台
    Activate();
    IntPtr mainHandle = new WindowInteropHelper(this).Handle;
    ApiHelper.SetForegroundWindow(mainHandle);
}

2. 改用MouseUp事件处理右键菜单

系统对托盘图标的MouseDown事件在焦点异常时可能被拦截,改用MouseUp事件更可靠:

// 替换原MouseDown事件注册,改为MouseUp
notifyIcon.MouseUp += Notifier_MouseUp;

// 新的右键菜单处理方法
void Notifier_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    { 
        // 先确保主窗口获取焦点
        IntPtr mainHandle = new WindowInteropHelper(this).Handle;
        ApiHelper.SetForegroundWindow(mainHandle);
        
        // 打开上下文菜单
        menu.IsOpen = true;
        menu.Focus();
    }
}

3. 优化上下文菜单的焦点配置

在XAML中简化Focusable设置,确保菜单可以正常获取焦点:

<Window.Resources>
  <ContextMenu
    Focusable="True"
    x:Key="NotifierContextMenu"
    StaysOpen="False"
    Placement="MousePoint">
    <MenuItem Header="Open" Click="Menu_Open"/>
    <MenuItem Header="Close" Click="Menu_Close"/>
  </ContextMenu>
</Window.Resources>

4. 增强窗口焦点恢复逻辑

在CheckTrayIcon方法中补充焦点检查,确保应用在后台时能正确响应操作:

void CheckTrayIcon()
{
    ShowTrayIcon(true);
    if (!IsActive)
    {
        IntPtr mainHandle = new WindowInteropHelper(this).Handle;
        ApiHelper.SetForegroundWindow(mainHandle);
    }
}

额外说明

  • 使用WindowInteropHelper获取主窗口句柄比PresentationSource.FromVisual更可靠,尤其是窗口处于隐藏或最小化状态时。
  • 右键菜单改用MouseUp事件,是因为Windows托盘图标的消息机制中,MouseUp事件在焦点恢复后更易被触发,而MouseDown可能被系统焦点切换逻辑吞噬。

内容的提问来源于stack exchange,提问作者Kaan Çağhan Özaydın

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:38:10