2016-12-12 62 views
0

我目前正在編寫基本上充當第三方程序的看門狗的C#程序:如果通信量低於某個值,則該進程被終止並重新啓動[使用簡單的taskkill /im]。
這是工作得很好,只有一個例外 - 如果程序最小化到系統托盤,它不會響應taskkill /im,你必須用taskkill /f /im強制終止它。C#控制系統托盤中的第三方程序

正如人們所猜測的,這並不是結束程序的最佳方法。所以我目前正在尋找一種方法來訪問Windows系統托盤,並基本上執行一個程序點擊/調用一種方法,使其恢復到正常狀態。
我曾想過在字盤上模擬點擊,但發現這種方法是不準確和不可預測的。
有沒有另一種方法來完成這個[例如使用系統api]?

謝謝!

+0

如果第三方程序沒有任何關閉確認對話框,則可能是將一個Process對象附加到運行的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

你可以做這樣的

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

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

雖然這東西,如果過程中仍然有一個窗口只會工作得到WindowHandle。

0

您可以在窗口中使用另一個應用程序的托盤圖標迭代的唯一方法是模擬鼠標單擊。這有市長的缺陷,如果用戶在與鼠標交互的同時你「鋼」他光標,他不能工作。

如果你知道你不會得到一個內存韭菜(如果它是一個託管的應用程序,你贏了),並且你正在查殺的應用程序在退出進程時沒有做一些重要的事情。殺死是更好的選擇。