私はシステムトレイのアイコンを持つアプリケーションを持っています。アンインストール中に、実行中の場合はプロセスを終了します。したがって、アプリケーションを正常に停止していないので、アイコンはシステムトレイに残っており、マウスをマウスの上に置いた場合にのみアイコンが削除されます。私はトレーに沿ってカーソルを動かし、カーソルを最初の位置に戻すコードを書いた。システムトレーのアイコンをプログラムでリフレッシュ
[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;
}
このオプションは、「通知アイコンを表示しない」場合を除き、すべてのケースでは良い作品有効になっている:これは私がやっていることです。この場合トレイをリフレッシュできる方法はありますか?
EDIT 私はアプローチを変更しました。トレイアプリケーションを強制終了する代わりに、アプリケーションサービス(あまりにも言及するのを忘れてしまった、私はアプリケーションと一緒に実行しているサービスがある)とトレイアプリケーションとの間の通信を確立しました。アンインストール中にサービスを停止すると、特定の形式のソケットメッセージをトレイアプリケーションに送信して終了するように要求し、通知アイコンの可視性をfalseに設定します。これにより、トレイアプリケーションはバックグラウンドで実行されたままになるため、「タスクキル」を使用してアプリケーションを削除します。 Win7とVistaでは正常に動作しましたが、Win XPでは正常に動作しません。しかし、私は環境固有のコードを書いていません。可能性のある手がかりは?
よく似たような状況が1度ありました。私がしたことは、Form_ClosingイベントのNotifyIconコンポーネントから取り除かれ、うまくいきました。 –
アンインストーラから、アプリケーションとのやりとりをする方法があまりにもハッキリではないかもしれません。 (私はこの分野で知識がありませんが) –
あなたはこのようなコードを書いたくありません。殺してはいけません。 –