我安装了一个程序(“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等价物不同,该命令似乎不接受表明杀戮应该是多么残酷的参数。答案 0 :(得分:0)
是的,正如您所发现Process.CloseMainWindow
只关闭带有主窗口的程序,即您很可能会发现MainWindowHandle
将是IntPtr.Zero
Process.CloseMainWindow Method ()
通过发送关闭来关闭具有用户界面的流程 消息到其主窗口
此外,AFAIK WM_CLOSE
或任何其他消息也无法帮助您
但是,您可以创建仅限消息的窗口,或将主窗口设置为不可见,以便您可以标准方式发送消息或致电Process.CloseMainWindow
。
但是,您可以使用许多其他 IPC 技术来实现相同的效果,甚至 WCF 。无论如何,既然您已经控制了同步托盘图标程序,那么您可以使用任何东西(除了显然需要窗口的技术)
<强>更新强>
由于它是开源的,你可以根据需要进行编辑或查看它的内部结构,你可能会找到一种方法来优雅地关闭它。