1

ユーザーが citrix で CRM システムを起動したときに実行されるスクリプトの最初のステップとして実行される C# コマンド ライン アプリを作成しました (これは公開アプリです)。コマンド ラインの目的は、システム トレイで 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 アイコンを非表示にすることです。アイコンを抑制しないと、エンド ユーザーのトレイに 2 つの Outlook アイコンが表示されます。1 つはローカルの Outlook からのもので、もう 1 つは CRM ソフトウェアが機能するためにバックグラウンドで citrix で実行されている Outlook のものです (VSTO プラグインを実行できるようにする必要があるため、CRM ソフトウェアは埋め込みモードで Outlook を使用しません。埋め込みモードで読み込まれます)。誰かがもっと簡単な方法を知っていれば、私はすべて耳を傾けます。

ありがとう

4

2 に答える 2

1

最初の行を確認することをお勧めします。IntPtr.ZeroNull の代わりに渡す必要があります。これは通常、デスクトップを取得するための最良の方法です。Shell Services Service も (通常はまったく別の名前で) 実行されている必要があり、Explorer も実行されている必要があります。その後、Spy++ を実行すると Enlighten が実行されるかどうかを確認することを検討します。

于 2009-07-08T15:21:40.503 に答える
0

私のシステムでは、階層は

Shell_TrayWnd -> TrayNotifyWnd -> SysPager -> ToolbarWindow32

于 2009-09-25T00:44:01.700 に答える