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

时间:2018-03-02 08:09:48

标签: c# windows winforms process

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

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

Process process = Process.Start(@"C:\Programs\CmisSync\CmisSync.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

实现

1 个答案:

答案 0 :(得分:0)

是的,正如您所发现Process.CloseMainWindow只关闭带有主窗口的程序,即您很可能会发现MainWindowHandle将是IntPtr.Zero

Process.CloseMainWindow Method ()

  

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

此外,AFAIK WM_CLOSE或任何其他消息也无法帮助您

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

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

Interprocess Communications

<强>更新

由于它是开源的,你可以根据需要进行编辑或查看它的内部结构,你可能会找到一种方法来优雅地关闭它。