Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 优雅地关闭系统托盘应用程序_C#_.net_Winforms - Fatal编程技术网

C# 优雅地关闭系统托盘应用程序

C# 优雅地关闭系统托盘应用程序,c#,.net,winforms,C#,.net,Winforms,我有一个运行在系统托盘(通知区域)中的非常基本的应用程序。Main方法如下所示: using (NotifyIcon notifyIcon = new NotifyIcon()) { notifyIcon.ContextMenuStrip = new ContextMenuStrip(); notifyIcon.ContextMenuStrip.Items.Add(new ToolStripMenuItem( "Exit", null,

我有一个运行在系统托盘(通知区域)中的非常基本的应用程序。
Main
方法如下所示:

using (NotifyIcon notifyIcon = new NotifyIcon())
{
    notifyIcon.ContextMenuStrip = new ContextMenuStrip();
    notifyIcon.ContextMenuStrip.Items.Add(new ToolStripMenuItem(
        "Exit", 
        null, 
        delegate { App.Exit(); }
        )
    );

    notifyIcon.Icon = Properties.Resources.MyIcon;
    notifyIcon.Visible = true;

    Application.Run();
}

到目前为止,这一切正常(我可以使用上下文菜单中的退出选项,应用程序可以正确退出。但是,卸载软件时,我需要退出应用程序。现在我正在使用WiX安装程序中的
taskkill
来完成这项工作(可能有更好的方法?)。问题是,如果我执行
taskkill/im myapp.exe
操作,通知区域中的图标将消失,但进程仍在运行。如果我使用
taskkill/f/im myapp.exe
强制关闭它,则进程将结束,但图标仍会保留(直到我将鼠标悬停在其上)。是否有方法从单独的进程中删除图标并结束进程?

将隐藏表单添加到应用程序中。它将成为application.Run()的参数。当表单关闭时,应用程序将退出


要使表单在WiX us中关闭,请使用一个util:CloseApplication,并将CloseMessage属性设置为true。

我决定采用另一种方法。我添加了一个命令行参数以指示我要关闭。然后,此开关将调用Win32 API
SendMessage
(奇怪的是
PostMessage
不起作用)通过使用
RegisterWindowMessage定义的自定义消息
。然后WiX安装程序将使用此命令行参数执行进程,现在一切正常关闭。这是一个多么严重的问题…

您需要告诉您的应用程序退出,以便它可以从系统托盘中取消注册。taskkill只是从内存中卸载进程,该过程没有机会做任何响应。这很有效,非常感谢。仅供参考,对于其他人:我在调用
应用程序之前,通过将
ShowInTaskbar
属性设置为
false
并将
WindowState
设置为
FormWindowState,在新构造的表单上最小化了
,从而创建了一个不可见的表单。跑步(myForm)
。好的,在进一步测试之后,这并不总是有效的。如果我在尝试关闭应用程序之前打开上下文菜单,图标会消失,但过程会继续运行。如果我不右键单击并打开上下文菜单,一切都会很好。知道发生了什么吗?上下文菜单本身看起来很无害……可能是图标和菜单控件需要一个在消息循环中运行的容器,以便在消息循环终止之前卸载。请尝试使用WinForm designer将图标和菜单放置在表单上。即使其包含的表单被隐藏,图标和菜单仍将显示。好主意,但仍然不起作用。我尝试对此进行了一些检查使用调试器关闭,它看起来像是
应用程序。Run
仍在运行(即使通知图标已消失)。这几乎就像是上下文菜单接管了应用程序的主窗体或其他什么?但这并不能解释通知图标是如何被删除的……这真的很奇怪。为了给我之前的评论添加更多信息,我在窗体上覆盖了WndProc方法,并在其中设置了一个断点以查看会发生什么。没有打开上下文菜单当我使用taskkill时,我会收到一堆消息。但是,如果我打开上下文菜单,然后调用taskkill,我什么也得不到。我怀疑上下文菜单不知何故正在接管进程的主要形式?