gpt4 book ai didi

c# - 调用 NotifyIcon 的上下文菜单

转载 作者:IT王子 更新时间:2023-10-29 03:57:16 27 4
gpt4 key购买 nike

我想让它左键单击 NotifyIcon 也会导致上下文菜单(使用 ContextMenuStrip 属性设置)也打开。我将如何实现这一目标?我是否必须自己处理点击并确定定位?
编辑:使用 trayIcon.ContextMenuStrip.Show() 结果显示菜单是一些不良行为:

菜单未显示在与右键单击 NotifyIcon 相同的位置(看起来您无法将 x 和 y 坐标设置到任务栏所在的位置,至少在我正在运行的 Windows 7 上是这样).它会出现在任务栏上方(没什么大不了的,但一致性会很好)。

显示菜单时,任务栏中会添加一个额外的图标。

单击菜单以外的其他地方不会关闭它(而如果您右键单击以调出上下文菜单,单击其他地方会自动关闭上下文菜单)。

是否可以只调用菜单,但内置的右键单击处理程序正在执行此操作?

最佳答案

您通常会处理 MouseClick 事件以检测点击并调用 ContextMenuStrip.Show() 方法:

    private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) {
contextMenuStrip1.Show(Control.MousePosition);
}

但这实际上并不能正常工作,当您在 CMS 外部单击时,CMS 不会关闭。潜在问题是 Windows 怪癖(又名“错误”),在 this KB article 中有所描述。 .

在您自己的代码中调用此解决方法非常痛苦,pinvoke 令人不快。 NotifyIcon 类在其 ShowContextMenu() method 中有此解决方法,因为它是私有(private)方法,所以很难访问。反射可以绕过该限制。我在 5 年前发现了这个 hack,但还没有人报告过它的问题。设置 NFI 的 ContextMenuStrip 属性并实现 MouseUp 事件,如下所示:

using System.Reflection;
...
private void notifyIcon1_MouseUp(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
MethodInfo mi = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
mi.Invoke(notifyIcon1, null);
}
}

关于c# - 调用 NotifyIcon 的上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2208690/

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