我正在编写一个C#程序,它基本上是第三方程序的监视程序:如果流量低于某个值,则该进程被终止[然后使用简单的taskkill /im
]重新启动。
这是完全正常的,但有一个例外 - 如果程序最小化到系统托盘,它将不会响应taskkill /im
,您必须使用taskkill /f /im
强制终止它。
可以猜测,到目前为止,这不是结束程序的最佳方式。所以我目前正在寻找一种访问Windows系统托盘的方法,基本上点击程序/调用一种方法,使其恢复正常。
我曾想过在字面上模拟托盘上的点击,但发现这种方法是不准确和不可预测的方式。
有没有其他方法可以实现[例如使用系统api]?
谢谢!
答案 0 :(得分: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;
}
虽然这只有在进程仍有窗口时才有效。
答案 1 :(得分:0)
在Windows中使用另一个应用程序的托盘图标进行迭代的唯一方法是通过模拟鼠标单击。这有一个市长缺陷,如果用户在与鼠标交互的同时你“钢化”他的光标并且他无法工作。
如果你知道你最终不会得到一个记忆韭菜(如果它是一个你已经赢得的托管应用程序),那么你杀死的应用程序并没有做一些重要的事情,当它退出进程时,杀死是更好的选择。