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

问题描述 投票:0回答:1

我安装了一个程序(“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实现

c# windows winforms process
1个回答
0
投票

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

Process.CloseMainWindow Method ()

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

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

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

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

Interprocess Communications

更新

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

© www.soinside.com 2019 - 2024. All rights reserved.