2016-12-12 3 views
0

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

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

Спасибо!

+0

Если сторонняя программа не имеет каких-либо закрытых диалоговых окон подтверждения, тогда возможно подключить объект «Процесс» к исполняемому exe, затем вызвать ['CloseMainWindow()'] (https://msdn.microsoft.com /en-us/library/system.diagnostics.process.closemainwindow(v=vs.110).aspx), который из того, что я понимаю, эквивалентен нажатию 'X' в главном окне. – Quantic

ответ

1

Вы можете попытаться использовать 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); 

Взято из this SO ответ. Для получения полного списка состояний окна посетить этот MSDN Page

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

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

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

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

0

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

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