Код: Выделить всё
[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. Но я не писал никакого кода для конкретной среды. Есть какая-нибудь подсказка?
Подробнее здесь: https://stackoverflow.com/questions/834 ... mmatically
Мобильная версия