システム トレイ アイコンを持つアプリケーションがあります。アンインストール中に、実行中のプロセスを強制終了しています。そのため、アプリを正常に停止していないため、アイコンはシステム トレイに残り、マウスをその上に置いた場合にのみ削除されます。トレイに沿ってカーソルを実行し、カーソルを初期位置に戻すコードを作成しました。これは私がやったことです:
[DllImport("user32.dll")]
static extern IntPtr FindWindow(string className, string windowName);
[DllImport("user32.dll")]
static extern IntPtr FindWindowEx(IntPtr parent, IntPtr child, string className, string windowName);
[DllImport("user32.dll")]
static extern bool GetWindowRect(HandleRef handle, out RECT rct);
[StructLayout(LayoutKind.Sequential)]
struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
void RefreshTray()
{
IntPtr taskbar_Handle = FindWindow("Shell_Traywnd", "");
IntPtr tray_Handle = FindWindowEx(taskbar_Handle, IntPtr.Zero, "TrayNotifyWnd", "");
RECT rct;
if (!(GetWindowRect(new HandleRef(null, tray_Handle), out rct)))
{
}
System.Drawing.Point init = Control.MousePosition;
for (int i = rct.Left; i < rct.Right-20; i++)
{
Cursor.Position = new System.Drawing.Point(i, (rct.Bottom + rct.Top) / 2);
}
Cursor.Position = init;
}
これは、「通知アイコンを表示しない」オプションが有効になっている場合を除いて、すべての場合にうまく機能します。この場合、トレイを更新する方法はありますか?
編集 コメントが示唆したように、私はアプローチを変更しました。トレイ アプリケーションを強制終了する代わりに、アプリケーション サービス (言い忘れましたが、アプリケーションと一緒にサービスも実行しています) とトレイ アプリケーションの間の通信を確立しました。アンインストール中にサービスを停止します。サービス停止メソッドから、特定の形式のソケット メッセージをトレイ アプリケーションに送信して閉じるように依頼し、通知アイコンの可視性を false に設定します。これにより、トレイ アプリケーションがバックグラウンドで実行されたままになるため、「タスクキル」を使用してアプリケーションを削除しています。Win7 と Vista では問題なく動作しましたが、Win XP では正しく動作しません。しかし、私は環境固有のコードを書いていません。考えられる手がかりはありますか?