2011-03-01 58 views
0

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

双击图标仍然表现得如预期,所以我知道它并没有完全破碎。不过,我们也需要上下文菜单才能工作。有人知道什么可能是错的吗?另一个信息:如果我按Ctrl + Alt + End打开Windows安全屏幕(允许您注销,锁定会话等),然后关闭该屏幕,上下文菜单开始工作。

回答

0

看来发生这种情况的原因是应用程序在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. 定时器启动时,取消定时器并显示上下文菜单。

这应该适用于本地使用和RemoteApp使用。步骤1中的超时值需要足够长,以便在WM_CONTEXTMENU进入之前不超过,但不再超过。

相关问题