1

当我左键单击 NotifyIcon 时,我试图显示上下文菜单。仅仅调用 NotifyIcon.ContextMenuStrip.Show() 并不能很好地工作。在此之前已在此处发布了一个解决方案,该解决方案使用反射调用了一个秘密方法:

Dim mi As System.Reflection.MethodInfo = GetType(NotifyIcon).GetMethod("ShowContextMenu", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
mi.Invoke(Icon, Nothing)

这很好用,除了我还需要控制菜单的显示位置。我想在接收到 NotifyIcon.MouseUp 事件和显示菜单之间等待 SystemInformation.DoubleClickTime 过去,以便我可以分别处理单击和双击。但是,当调用 ShowContextMenu 时,调用 ShowContextMenu 方法会在当前鼠标位置显示菜单,而不是在实际单击图标时。这意味着如果鼠标在 DoubleClickTime 期间移动,菜单将显示在屏幕的不同部分。所以如果我可以控制菜单的显示位置,我可以在收到 MouseUp 事件时保存鼠标坐标,然后我可以确保菜单显示在图标附近。有没有办法做到这一点?

提前致谢。

4

1 回答 1

0

好吧,我刚刚发现存在表现出相同行为的现有程序。我刚刚浏览了系统托盘中的所有图标,其中大约一半做到了。如果您在菜单出现之前的延迟期间左键单击图标然后移动鼠标,则菜单将出现在最后一个鼠标位置,无论它在屏幕上的哪个位置。Snagit 是一个执行此操作的应用程序。Outlook 是我托盘中唯一始终显示我单击图标的菜单的程序。但 Snagit 看起来它使用的是 .NET ContextMenuStrip,而 Outlook 可能使用的是本机菜单。

所以要么这是标准行为,要么是其他人无法解决的问题。作为用户,直到昨天我在测试自己的应用程序时才注意到这种行为。所以我想这没什么大不了的,我不会担心。

于 2010-03-19T18:18:04.320 回答