【问题标题】:Why doesn't the tray icon context menu work for my RemoteApp?为什么托盘图标上下文菜单不适用于我的 RemoteApp?
【发布时间】:2011-07-06 16:17:30
【问题描述】:
我有一个应用程序,它使用Shell_NotifyIcon 将图标添加到通知区域(也称为“系统托盘”)。该图标有一个包含各种重要命令的上下文菜单。当应用程序在本地系统上运行时,上下文菜单可以正常工作。但是,当应用程序作为终端服务RemoteApp 运行时,右键单击该图标不会显示上下文菜单。用于打开上下文菜单的各种基于键盘的方法也不起作用。
双击该图标仍按预期运行,所以我知道它并没有完全损坏。不过,我们需要上下文菜单也能正常工作。有谁知道可能出了什么问题?
编辑:还有一条信息:如果我按 Ctrl+Alt+End 打开 Windows 安全屏幕(让您注销、锁定会话等),然后关闭它屏幕,上下文菜单开始工作。
【问题讨论】:
标签:
windows
contextmenu
system-tray
trayicon
remoteapp
【解决方案1】:
出现这种情况的原因似乎是应用程序在 RemoteApp 案例中没有收到WM_CONTEXTMENU 通知。通常的WM_RBUTTONDOWN 和WM_RBUTTONUP 通知会到达,但仅此而已。奇怪的是,如果您尝试使用键盘激活上下文菜单,您也会收到WM_RBUTTONDOWN 和WM_RBUTTONUP,即使没有使用鼠标。按 Ctrl+Alt+End 似乎可以解决此问题;系统开始发送正常的WM_CONTEXTMENU 通知。我的猜测是这是远程桌面客户端进程中的一个错误。
一个潜在的解决方法是使用WM_RBUTTONUP 触发上下文菜单,但这会破坏键盘的可访问性,所以我不推荐它。
我确定的解决方法如下:
- 当您看到
WM_RBUTTONUP 通知时,请设置一个短超时(50-100 毫秒)的计时器。
- 当您看到
WM_CONTEXTMENU 通知时,取消计时器并显示上下文菜单。
- 当定时器触发时,取消定时器并显示上下文菜单。
这应该适用于本地使用和 RemoteApp 使用。第 1 步中的超时值需要足够长,以便在 WM_CONTEXTMENU 进来之前它不会过期,但不会再过期。