У меня есть приложение с иконкой в системном трее. При удалении я убиваю процесс, если он работает. Итак, поскольку я не изящно останавливаю приложение, значок остается в системном трее и удаляется, только если мы наводим на него мышь. Я написал код, который будет запускать курсор вдоль лотка и вернуть курсор в исходное положение. Это то, что я сделал:Иконки программных панелей программно
[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. Это заставит приложение Tray работать в фоновом режиме, поэтому я использую «taskkill» для удаления приложения. Он отлично работал в Win7 и Vista, но не работает должным образом в Win XP. Но я не написал никакого кода, специфичного для среды. Любая возможная подсказка?
Ну, у меня была подобная ситуация. То, что я сделал, было отключено от компонента NotifyIcon в событии Form_Closing, и он работал хорошо. –
Менее опасным способом может быть способ общения с вашим приложением, с помощью деинсталлятора. (хотя у меня нет знаний в этой области) –
Вы не хотите писать такой код. Не убивайте, спросите красиво. –