我有一個具有系統托盤圖標的應用程序。卸載時,我正在殺死進程,如果它的運行。所以,當我沒有優雅地停止應用程序時,圖標將保留在系統托盤中,並且只有當我們將鼠標懸停在系統托盤上時纔會刪除。我編寫了一個代碼,可以沿着托盤運行光標,並將光標恢復到初始位置。這是我所做的:以編程方式刷新系統托盤圖標
[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。這會讓Tray應用程序在後臺運行,所以我使用「taskkill」來刪除應用程序。它在Win7和Vista中運行良好,但在Win XP中無法正常工作。但我沒有寫任何環境特定的代碼。任何可能的線索?
那麼我曾經有過類似的情況。我所做的是在Form_Closing事件中處理NotifyIcon組件,它運行良好。 –
更簡單的方法可能是通過卸載程序與應用程序進行通信。 (雖然我沒有這方面的知識) –
你不想寫這樣的代碼。不要殺人,要好好問。 –