这不是这个帖子的复制。我从这篇文章中得到了我的解决方案,但我的应用程序是winforms应用程序,而不是控制台应用程序,这是行不通的。
所以我有一个项目正在后台运行。基本上,我创建了一个Windows应用程序,但我没有在Program.cs中调用该表单。我创建了一个类,用于侦听应用程序何时退出:
class ShutDownManager
{
public ShutDownManager()
{
_handler += new EventHandler(Handler);
SetConsoleCtrlHandler(_handler, true);
}
static bool exitSystem = false;
[DllImport("Kernel32")]
private static extern bool SetConsoleCtrlHandler(EventHandler handler, bool add);
private delegate bool EventHandler(CtrlType sig);
static EventHandler _handler;
enum CtrlType
{
CTRL_C_EVENT = 0,
CTRL_BREAK_EVENT = 1,
CTRL_CLOSE_EVENT = 2,
CTRL_LOGOFF_EVENT = 5,
CTRL_SHUTDOWN_EVENT = 6
}
private static bool Handler(CtrlType sig)
{
Console.Writeline("I'M OUT OF HERE");
return true;
}
}我在Program.cs的主函数中创建了这个类的一个实例。然而,这似乎并没有开火。它的工作原理就像控制台应用程序中的魅力,但是当涉及到我的窗体应用程序(没有表单)时,它就不能工作了。,有什么问题吗?
我的代码主要是:
static void Main()
{
ShutDownManager sdm = new ShutDownManager();
StartUpManager.AddApplicationToCurrentUserStartup();
Timers timers = new Timers();
}发布于 2017-08-30 13:06:36
让我详细分析一下您的处境: learn.microsoft.com on SetConsoleCtrlHandler的摘录
每个控制台进程都有自己的应用程序定义的HandlerRoutine函数列表,这些函数处理CTRL+C和CTRL+BREAK信号。处理程序函数还处理当用户关闭控制台、注销或关闭系统时系统生成的信号。控制台进程通过调用SetConsoleCtrlHandler函数添加或删除其他处理程序函数,这不会影响其他进程的处理程序函数列表。
正如您注意到的,这似乎仅指控制台进程。它不能告诉您其他应用程序何时退出,而只知道这个应用程序。此外,它还可以通知您的LOGOFF和SHUTDOWN。此外,由于没有控制台(因为您需要后台进程),因此不涉及CTRL或CTRL中断处理。
结论:最好的情况是您只能得到关于LOGOFF和SHUTDOWN的通知
有关winforms应用程序的相关信息:
此函数为控制台应用程序和服务提供了类似的通知,与WM 为图形应用程序()提供的消息泵提供的通知类似。
你的代码有什么问题?
它的设计是在系统运行LOGOFF或SHUTDOWN 时,当应用程序运行时提供回调。不用说,您的应用程序已经退出接收此类事件。所以你必须在登记回拨后再等。
,什么是最好的方法?
您应该为此编写一个服务。如果我没有弄错的话,服务已经收到了LOGOFF的通知,SHUTDOWN 如何编写简单的C#服务有一个很好的例子。
编辑:
要获得更全面的理解,您可能需要查看关于ServiceBase类的MSDN文档。另外,您应该查看OnSessionChange事件,它是关于所有会话事件的通知。它在类医生上有一些有用的代码摘录。同样适用于事件
现在,如果您无法执行windows服务,则必须从您的winform应用程序中创建一个Form,并使该表单不可见。然后您应该处理事件或使用事件来处理这种情况。
的示例代码
var frm = new Form();
frm.Activated += (s, e) => { frm.Visible = false; };
SystemEvents.SessionEnded += (s, e) => { /* your code to handle logoff and shutdown */ };
Application.Run(frm);https://stackoverflow.com/questions/45960657
复制相似问题