无窗口 Winforms 应用程序上的关闭事件

Closing Event on Windowless Winforms App

如何在这个非常简单的应用程序中获得关闭事件?这是一个无窗口的 winforms 应用程序。我不想有一个托盘图标,至少不是可见的。

Module Module1
    Sub Main()
        While True
            MsgBox("I am still alive!")
            System.Threading.Thread.Sleep(10000)
        End While
    End Sub

    ' how do I call this?
    Public Sub ProgramClosing()
        MsgBox("Program is closing. Good Bye.")
    End Sub
End Module

更新:

下面的代码有效,但出于某种原因,我收到了两条消息 "Program closing. Good Bye.",而不是一条。

Module Module1
    Sub Main()
        AddHandler Application.ApplicationExit, AddressOf AppClosing
        For i = 0 To 2
            MsgBox(i & vbCrLf & "I am still alive!")
            System.Threading.Thread.Sleep(5000)
        Next
        Application.Exit()
    End Sub

    Private Sub AppClosing(sender As Object, e As EventArgs)
        MsgBox("Program closing. Good Bye.") ' THIS IS SHOWN TWICE
    End Sub
End Module

更新 #2

我已经测试过当 Windows 实际关闭时是否会触发此事件,但它没有。

我用下面的代码构建了应用程序,启动了应用程序(在 Visual Studio 之外),使用任务管理器确认它是 运行 并关闭了计算机。文件“DebugFile.txt”从未创建。

Module Module1
    Sub Main()
        AddHandler Application.ApplicationExit, AddressOf AppClosing
        While True
            ' do tasks here
            System.Threading.Thread.Sleep(10000)
        End While
    End Sub

    Private Sub AppClosing(sender As Object, e As EventArgs)
        RemoveHandler Application.ApplicationExit, AddressOf AppClosing
        System.IO.File.AppendAllText("DebugFile.txt", "App closed at " & Now.ToString & vbCrLf)
    End Sub
End Module

本质上,while循环一结束,你的程序就"closing."也就是说,除非你在后面放代码,否则程序就会退出。在 End While 之后立即调用 ProgramClosing() 怎么样?

哦,正如 @436f6465786572 在 his/her 评论中所说,我愚蠢地没有观察到你的 while 循环是无限的。所以添加一些退出循环的方法。

如果应用程序应该 运行 不断,那么我会将其更改为 Win From 而不是控制台(我附上了 C# 示例,您可以轻松将其转换为 VB.Net。 您可以在没有任何 GUI 的情况下使用表单中的以下内容加载 winform 应用程序 加载事件:

private void Form1_Load(object sender, EventArgs e)
{
    this.Hide();
    this.Visible = false;
    this.Opacity = 0;
    this.ShowInTaskbar = false;
}

您也可以在下面看到更多详细信息post How can I hide my application's form in the Windows Taskbar? 现在,使用表单关闭事件来做任何你想做的事情。

private void frmMonitor_FormClosing(object sender, FormClosingEventArgs e)
{
    //Your exit code
}

它应该 运行 只有一次。

另一种选择是 运行 在 FormClosed 事件 上,该事件将在表单关闭后执行。

希望对您有所帮助,
里昂