无窗口 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 事件 上,该事件将在表单关闭后执行。
希望对您有所帮助,
里昂
如何在这个非常简单的应用程序中获得关闭事件?这是一个无窗口的 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 事件 上,该事件将在表单关闭后执行。
希望对您有所帮助,
里昂