为什么托盘图标上下文菜单不能用于我的RemoteApp?

时间:2011-03-01 17:07:03

标签: windows contextmenu system-tray trayicon remoteapp

我有一个应用程序,它使用Shell_NotifyIcon在通知区域(也就是“系统托盘”)中添加一个图标。该图标具有包含各种重要命令的上下文菜单。当应用程序在本地系统上运行时,上下文菜单工作正常。但是,当应用程序作为终端服务RemoteApp运行时,右键单击该图标不会显示上下文菜单。用于打开上下文菜单的各种基于键盘的方法也不起作用。

双击图标仍然按预期运行,所以我知道它并没有完全坏掉。不过,我们还需要上下文菜单。有人知道可能有什么问题吗?

编辑:还有一条信息:如果我按Ctrl + Alt + End打开Windows安全屏幕(允许您注销,锁定会话等),然后关闭屏幕,上下文菜单开始工作。

1 个答案:

答案 0 :(得分:1)

似乎发生这种情况是因为应用程序在RemoteApp案例中没有收到WM_CONTEXTMENU通知。通常的WM_RBUTTONDOWNWM_RBUTTONUP通知会到达,但这就是全部。奇怪的是,如果您尝试使用键盘激活上下文菜单,即使没有涉及鼠标,您也会收到WM_RBUTTONDOWNWM_RBUTTONUP。按Ctrl + Alt + End可解决此问题;系统开始发送正常的WM_CONTEXTMENU通知。我的猜测是,这是远程桌面客户端进程中的一个错误。

一个可能的解决方法是使用WM_RBUTTONUP触发上下文菜单,但这会破坏键盘的可访问性,所以我不推荐它。

我确定的解决方法如下:

  1. 当您看到WM_RBUTTONUP通知时,请设置一个具有短暂超时(50-100ms)的计时器。
  2. 当您看到WM_CONTEXTMENU通知时,请取消计时器并显示上下文菜单。
  3. 当计时器触发时,取消计时器并显示上下文菜单。
  4. 这应该适用于本地使用和RemoteApp使用。步骤1中的超时值需要足够长,以便在WM_CONTEXTMENU进入之前不会过期,但不会再过期。