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

C# 控制系统托盘中的第三方程序,c#,windows,api,system-tray,C#,Windows,Api,System Tray,我目前正在编写一个C#程序,它基本上是第三方程序的看门狗:如果流量低于某个值,进程将被终止,然后重新启动[使用简单的taskkill/im。 这工作正常,但有一个例外-如果程序最小化到系统托盘,它将不会响应taskkill/im,您必须使用taskkill/f/im强制终止它 正如人们可以猜测的那样,这并不是结束一个项目的最佳方式。因此,我目前正在寻找一种方法来访问Windows系统托盘,基本上只需单击程序/调用一种方法即可将其最大化,使其恢复正常。 我曾想过模拟点击托盘,但发现这种方法不准确且

我目前正在编写一个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);
摘自这样的答案。 有关窗口状态的完整列表,请访问

您可以通过这样做来获得WindowHandle

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

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

不过,这仅在进程仍有窗口的情况下才有效。

在windows中使用另一个应用程序的托盘图标的唯一方法是模拟鼠标单击。这有一个缺陷,即如果用户在与鼠标交互的同时,你“钢化”了他的光标,他就无法工作


如果你知道你最终不会得到一个内存韭葱(如果你赢了一个托管应用程序)而您正在终止的应用程序在退出进程终止时没有做一些重要的事情是更好的选择。

如果第三方程序没有任何关闭的确认对话框,那么可以将
进程
对象附加到正在运行的exe,然后调用,据我所知,这相当于单击主窗口上的
X