Process.CloseMainWindow等效于托盘中运行的程序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Process.CloseMainWindow等效于托盘中运行的程序?相关的知识,希望对你有一定的参考价值。

我安装了一个程序(“CmisSync.exe”),它在Windows系统托盘中作为一个小图标运行。

从C#我想启动它,然后优雅地退出它(好像用户点击了程序菜单中的“退出”)。这是我的尝试:

Process process = Process.Start(@"C:ProgramsCmisSyncCmisSync.exe");

// Wait for CmisSync's configuration/UI to start properly.
Thread.Sleep(5000);

// Close as if the user had clicked "Exit".
process.CloseMainWindow();

// Wait for CmisSync to finish what it is doing and exit normally.
// This might take a few minutes if a big sync is going on.
process.WaitForExit();

不幸的是,CloseMainWindow不会让程序停止。

也许是因为该程序实际上没有主窗口?它只在托盘中运行。

  • Close也没有使程序停止,by design
  • Kill不优雅,它不会让程序完成当前的UI循环。与UNIX等价物不同,该命令似乎不接受指示杀死应该是多么残酷的参数。

托盘图标使用System.Windows.Forms.Form实现

答案

是的,因为你发现Process.CloseMainWindow只关闭一个带有主窗口的程序,你很可能会发现MainWindowHandle将是IntPtr.Zero

Process.CloseMainWindow Method ()

通过向主窗口发送关闭消息来关闭具有用户界面的进程

此外,AFAIK WM_CLOSE或任何其他消息也不会帮助你

但是,您可以创建仅限消息的窗口,或将主窗口设置为不可见,以便您可以以标准方式发送消息或调用Process.CloseMainWindow

但是,还有许多其他IPC技术可用于相同的影响,甚至是WCF。无论如何,既然您可以控制同步托盘图标程序,那么您可以使用任何东西(除了显然需要窗口的技术)

Interprocess Communications

更新

从开源开始,您既可以根据需要进行编辑,也可以查看其内部结构,您可以找到一种方法来优雅地关闭它。

以上是关于Process.CloseMainWindow等效于托盘中运行的程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式关闭 Discord?

从外部进程优雅地关闭UWP应用程序

是否有与 FontUtilities.getCompositeFontUIResource(Font) 等效的非专有等效项?

变压器的等效电路

变压器的等效电路

VC数据类型的等效性