C#系统托盘中的控制第三方程序



我目前正在编写一个C#程序,该程序基本上是第三方程序的监督者:如果流量降至一定值以下,则该过程被杀死,然后重新启动[使用简单taskkill /im]。
这很好,除了一个例外 - 如果将程序最小化到系统托盘,则不会响应taskkill /im,并且必须用taskkill /f /im强制将其强加。

可以猜到,这不是结束程序的最佳方法。因此,我目前正在寻找一种访问Windows系统托盘并基本执行程序/调用方法以最大化为正常的方法的方法。
我曾经考虑过字面上模拟托盘的点击,但发现这种方法是不准确和不可预测的。
有其他方法可以[例如使用系统API]?

谢谢!

您可以尝试使用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);

从这个答案中获取。有关窗口状态的完整列表,请访问此MSDN页面

您可以通过执行此类操作

来获取窗口手
var processes = Process.GetProcessesByName("nameOfYourProcess");
foreach(var process in processes)
{
   var windowHandle = process.getMainWindowHandle;
}

虽然这仅在过程仍然有一个窗口的情况下起作用。

您可以使用Windows另一个应用程序的托盘图标iTeract的唯一方法是模拟鼠标单击。这是市长缺陷,如果用户同时与鼠标相互作用,则您可以"钢制"光标,而他将无法工作。

如果您知道最终不会带来内存韭菜(如果您赢得了托管应用程序),并且您杀死的应用程序在退出过程杀死时不会做一些重要的事情是更好的选择。

最新更新