gpt4 book ai didi

c# - 单击通知图标时交替显示/隐藏窗口

转载 作者:行者123 更新时间:2023-11-30 18:06:41 26 4
gpt4 key购买 nike

我正在 WPF 中实现一个 Windows 7/Vista 风格的通知区域(“系统托盘”)弹出应用程序。到目前为止,我已经写了我的工作 here (确定通知图标的位置、禁用调整大小等)。

但是,有一个问题我还没有完全满意地解决:第二次单击通知图标时隐藏窗口。如果您单击(例如)Vista/7 中的音量图标以显示音量控件,请注意,当您再次单击该图标时,它会再次隐藏。

我处理了窗口的 Deactivated 事件来隐藏窗口,当点击通知图标时窗口确实被停用了。然而,点击通知图标当然会显示并激活窗口,所以最终发生的是当鼠标按下时窗口消失并在释放鼠标时重新出现(完成鼠标点击事件)。

我的第一个想法是我可能会使用通知图标的 MouseDown 事件(我使用的是 System.Windows.Forms.NotifyIcon)并检查当时窗口是否可见 - 如果是,我可以将其解释为用户再次单击通知图标以隐藏窗口。不幸的是,MouseDown 事件似乎直到鼠标实际被单击(换句话说它的工作方式与 MouseClick 事件相同)后才会触发,此时窗口已经停用并因此被隐藏。这似乎排除了这个解决方案。

我的下一个想法(以及我最终使用的方法)是在窗口停用时获取光标位置 (GetCursorPos) 并检查该点是否在通知图标的范围内。同时,我还使用 GetForegroundWindow 来查找当前事件的窗口——如果确实要单击通知图标,则它应该是任务栏(具有类名 Shell_TrayWnd 的顶级窗口)或通知区域弹出窗口(具有类名 NotifyIconOverflowWindow 的顶级窗口;仅限 Windows 7+)。简而言之,如果光标位于通知图标上并且通知区域处于事件状态,我假设用户按下通知图标以隐藏窗口。如果这些条件为真,则以下 MouseClick 事件将不会导致显示/激活窗口。

但这个解决方案至少有一个问题:如果光标悬停在通知图标上并且用户按下 Windows 键打开开始菜单(或使用 Windows 键 + 数字快捷方式打开应用程序),我的程序会错误地将其解释为鼠标按下通知图标(因为这些键盘快捷键使任务栏处于事件状态)。这意味着下次用户确实单击通知图标时,将不会显示该窗口。 (再次单击通知图标将显示它。)

我希望我写的内容有意义;如果没有,我很乐意尝试进一步澄清情况。

我很想知道是否有人对如何解决此问题有任何其他想法。

我怀疑这可能是不可能的:在我看来, native Windows 7 通知区域弹出应用程序本身使用一个简单的计时器实现。如果窗口停用和鼠标单击之间的时间小于大约 2 秒,则在音量控制打开时单击(例如)音量图标将仅关闭音量控制。将鼠标在图标上按住较长时间然后松开将再次显示音量控制,即使它在按下鼠标之前是打开的。

最佳答案

音量控制窗口不是这样工作的。当您点击任何地方时,它就会消失,包括通知图标。该图标不相关。这是一个标准的 Win32 技巧,它捕获鼠标以便它可以看到窗口外的点击。

WPF 中的 Mouse.Capture。做起来并不容易,因为它需要 IInputElement 而不是窗口句柄。

关于c# - 单击通知图标时交替显示/隐藏窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4585283/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com