С# управлять сторонней программой в системном трее

В настоящее время я пишу программу на C#, которая в основном функционирует как сторожевой таймер для сторонней программы: если трафик падает ниже определенного значения, процесс уничтожается, а затем перезапускается [с использованием простого taskkill /im].
Это работает отлично. хорошо, за одним исключением - если программа свернута в системный трей, она не будет реагировать на taskkill /im, и вам придется принудительно завершить ее с помощью taskkill /f /im.

Как можно догадаться, это далеко не лучший способ завершения программы. Поэтому в настоящее время я ищу способ получить доступ к системному трею Windows и в основном выполнить щелчок по программе / вызвать метод, чтобы развернуть его до нормального состояния.
Я думал о том, чтобы буквально имитировать щелчок на трее, но обнаружил, что этот метод является неточным и непредсказуемым.
Есть ли другой способ добиться этого [например, с помощью системного API]?

Спасибо!


person Grzzlwmpf    schedule 12.12.2016    source источник
comment
Если у сторонней программы нет диалоговых окон подтверждения закрытия, то можно прикрепить объект Process к работающему exe, а затем вызвать CloseMainWindow() что, насколько я понимаю, ~ эквивалентно нажатию X в главном окне.   -  person Quantic    schedule 12.12.2016


Ответы (2)


Вы можете попробовать использовать user32.dll, чтобы развернуть окно процессов.

// Pinvoke declaration for ShowWindow
private const int SW_SHOWMAXIMIZED = 3;

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

// Sample usage
ShowWindow(proc.MainWindowHandle, SW_SHOWMAXIMIZED);

Взято из этого ответа SO. Для получения полного списка состояний окна посетите этот Страница MSDN

Вы можете получить WindowHandle, выполнив что-то вроде этого

var processes = Process.GetProcessesByName("nameOfYourProcess");

foreach(var process in processes)
{
   var windowHandle = process.getMainWindowHandle;
}

Хотя это будет работать только в том случае, если у процесса все еще есть окно.

person mammago    schedule 12.12.2016

Единственный способ, с помощью которого вы можете взаимодействовать со значком в трее другого приложения в Windows, — это имитировать щелчок мышью. У этого есть главный недостаток: если пользователь взаимодействует с мышью, в то же время вы «укрепляете» его курсор, и он не может работать.

Если вы знаете, что у вас не будет памяти (если это управляемое приложение, которое вы выиграли), и приложение, которое вы убиваете, не делает некоторых важных вещей, когда оно выходит из процесса уничтожения, это лучший вариант.

person NtFreX    schedule 12.12.2016