1

我们编写了一个 C# 命令行应用程序,它作为脚本的第一步运行,当用户在 citrix 上启动我们的 CRM 系统时执行该脚本(它是一个已发布的应用程序)。命令行的目的是找到系统托盘上的outlook图标并将其隐藏。我们通过对各种 WIN32 方法的 PInvoke 调用来做到这一点,并且在非 citrix 环境中进行测试时效果很好。

当我们将它推广到我们的 Citrix 测试服务器并通过发布的应用程序脚本运行时,我们的代码没有找到我们希望在系统托盘中看到的 SysPager 和(更重要的是)ToolbarWindow32 窗口的窗口。有谁知道为什么?

示例代码:

IntPtr shellTrayHwnd = Win32.FindWindow("Shell_TrayWnd", null);
IntPtr sysPagerHwnd = Win32.FindWindowEx(shellTrayHwnd, IntPtr.Zero, "SysPager", null); //returns 0
IntPtr toolbarNotifyHwnd = Win32.FindWindowEx(shellTrayHwnd, IntPtr.Zero, "ToolbarWindow32", null);  //returns 0

正如我所说,这段代码在非 citrix 会话中运行时效果很好,但是一旦我们在 citrix 中运行,我们似乎就失去了获取这些句柄的能力。

仅供参考:这里的最终目标是在运行依赖于后台运行 Outlook 的 CRM 软件时隐藏发送到客户系统托盘的 Outlook 图标。如果我们不抑制图标,我们会在最终用户的托盘中获得两个 Outlook 图标。一个来自他们的本地 Outlook,另一个来自在后台运行在 citrix 上以使 CRM 软件工作的 Outlook(CRM 软件不使用嵌入式模式下的 Outlook,因为我们需要能够运行 VSTO 插件 - 这不以嵌入模式加载)。如果有人知道更简单的方法,我会全神贯注。

谢谢

4

2 回答 2

1

你可能想检查你的第一行。您需要通过IntPtr.Zero而不是 Null - 这通常是获取桌面的最佳方式。Shell Services Service 也应该运行(通常使用完全不同的名称)并且 Explorer 也需要运行......之后,我会考虑看看运行 Spy++ 是否会启发。

于 2009-07-08T15:21:40.503 回答
0

在我的系统上,层次结构是

Shell_TrayWnd -> TrayNotifyWnd -> SysPager -> ToolbarWindow32

于 2009-09-25T00:44:01.700 回答