关于无窗口Winforms App的闭幕活动

时间:2015-07-18 18:42:06

标签: c# vb.net winforms events messaging

如何在这个非常简单的应用程序中获得结束活动?这是一个无窗口的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

更新

以下代码有效,但出于某种原因,我收到两条消息"程序结束。再见。"而不是一个。

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

2 个答案:

答案 0 :(得分:1)

如果应用程序应该不断运行,那么我会将其更改为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;
}

您还可以在以下帖子中查看更多详细信息How can I hide my application's form in the Windows Taskbar? 现在,使用表单结束事件来做你想做的事。

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

它应该只运行一次。

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

希望它有所帮助,
Liron

答案 1 :(得分:-1)

基本上,只要while循环结束,你的程序就会“关闭”。也就是说,除非你在此之后输入代码,否则程序将退出。如何在End While之后立即调用ProgramClosing()?

哦,我愚蠢地没有注意到你的while循环是无限的,正如@ 436f6465786572在他/她的评论中所说的那样。所以添加一些方法来退出循环。