【发布时间】:2017-08-30 12:38:08
【问题描述】:
这不是此post 的副本。我从这篇文章中得到了我的解决方案,但它不起作用更不用说我的应用程序是 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 的 Main 函数中创建了这个类的一个实例。 然而,这似乎没有火。它在控制台应用程序中就像一个魅力,但是当涉及到我的表单应用程序(没有表单)时它不起作用。 可能是什么问题?
我在 Main 中的代码:
static void Main()
{
ShutDownManager sdm = new ShutDownManager();
StartUpManager.AddApplicationToCurrentUserStartup();
Timers timers = new Timers();
}
【问题讨论】:
-
首先:当您不想使用 winforms 时,为什么要使用 winforms 应用程序?您需要一个 winforms 应用程序与您的控制台应用程序有什么区别?
-
@MightyBadaboom 我希望我的应用程序在后台运行,并且在不调用表单的情况下创建一个 winforms 应用程序会被 windows 自动识别为后台应用程序。
-
你了解winform事件循环的工作原理吗?你确定
SetConsoleCtrlHandler可以在没有控制台的情况下工作吗?您可以在Main中显示您的代码吗? -
如果该代码在控制台中运行并且您不需要 UI,那么为什么不在后台运行该控制台应用程序。
-
这是一个非常hacky的方法来创建一个后台程序。我建议查看How to create a Service 以获得实现您想要的“正确”方式。至于在退出前执行代码,请查看this 答案。
标签: c#