我们编写了一个 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 插件 - 这不以嵌入模式加载)。如果有人知道更简单的方法,我会全神贯注。
谢谢