首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#在应用程序退出后台应用程序之前执行代码

C#在应用程序退出后台应用程序之前执行代码
EN

Stack Overflow用户
提问于 2017-08-30 12:38:08
回答 1查看 1K关注 0票数 1

这不是这个帖子的复制。我从这篇文章中得到了我的解决方案,但我的应用程序是winforms应用程序,而不是控制台应用程序,这是行不通的。

所以我有一个项目正在后台运行。基本上,我创建了一个Windows应用程序,但我没有在Program.cs中调用该表单。我创建了一个类,用于侦听应用程序何时退出:

代码语言:javascript
复制
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的主函数中创建了这个类的一个实例。然而,这似乎并没有开火。它的工作原理就像控制台应用程序中的魅力,但是当涉及到我的窗体应用程序(没有表单)时,它就不能工作了。,有什么问题吗?

我的代码主要是:

代码语言:javascript
复制
static void Main()
{
     ShutDownManager sdm = new ShutDownManager();
     StartUpManager.AddApplicationToCurrentUserStartup();
     Timers timers = new Timers();
}
EN

回答 1

Stack Overflow用户

发布于 2017-08-30 13:06:36

让我详细分析一下您的处境: learn.microsoft.com on SetConsoleCtrlHandler的摘录

每个控制台进程都有自己的应用程序定义的HandlerRoutine函数列表,这些函数处理CTRL+C和CTRL+BREAK信号。处理程序函数还处理当用户关闭控制台、注销或关闭系统时系统生成的信号。控制台进程通过调用SetConsoleCtrlHandler函数添加或删除其他处理程序函数,这不会影响其他进程的处理程序函数列表。

正如您注意到的,这似乎仅指控制台进程。它不能告诉您其他应用程序何时退出,而只知道这个应用程序。此外,它还可以通知您的LOGOFFSHUTDOWN。此外,由于没有控制台(因为您需要后台进程),因此不涉及CTRL或CTRL中断处理。

结论:最好的情况是您只能得到关于LOGOFFSHUTDOWN的通知

有关winforms应用程序的相关信息:

此函数为控制台应用程序和服务提供了类似的通知,与WM 为图形应用程序()提供的消息泵提供的通知类似。

你的代码有什么问题?

它的设计是在系统运行LOGOFFSHUTDOWN 时,当应用程序运行时提供回调。不用说,您的应用程序已经退出接收此类事件。所以你必须在登记回拨后再等。

,什么是最好的方法?

您应该为此编写一个服务。如果我没有弄错的话,服务已经收到了LOGOFF的通知,SHUTDOWN 如何编写简单的C#服务有一个很好的例子。

编辑:

要获得更全面的理解,您可能需要查看关于ServiceBase类的MSDN文档。另外,您应该查看OnSessionChange事件,它是关于所有会话事件的通知。它在类医生上有一些有用的代码摘录。同样适用于事件

现在,如果您无法执行windows服务,则必须从您的winform应用程序中创建一个Form,并使该表单不可见。然后您应该处理事件或使用事件来处理这种情况。

的示例代码

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45960657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档