所以我将我的应用程序设置为控制台类型的应用程序,并将其指向仅包含Sub Main的模块,即
Module mdlConsole
Sub Main(ByVal cmdArgs() As String)
If cmdArgs.Length = 0 Then
Dim frm As New frmMain
frm.Show()
End If
End Sub
End Module
理想情况下,如果没有提供参数,那么程序将只启动主表单。目标是使该程序(可选)从命令行编写脚本。如果提供了参数,则不会加载应用程序表单,并根据提供的命令行参数处理其功能。
现在,程序运行,短暂启动表单(frmMain)然后关闭。我做错了什么或错过了什么?
如果你不热衷于给我答案,我也很乐意指出正确的方向。我不指望任何人只提供答案。我也需要学习。
谢谢!
答案 0 :(得分:2)
对于Winforms,您需要运行' App对象,传递一个表单使用:
Sub Main(ByVal cmdArgs() As String)
If cmdArgs.Length = 0 Then
Dim frm As New frmMain
Application.Run(frm)
Else
' cmd line version
End If
End Sub
答案 1 :(得分:1)
我在评论中看到您要删除在使用当前建议的解决方案运行程序的表单版本时出现的控制台窗口。由于缺乏声誉,我无法发表评论,因此我会将此作为一个完整的答案。
考虑从反向角度处理这个问题:如果您将程序编写为表单应用程序,默认情况下打开它将显示该表单。但是在Form1_Load
事件中,检查命令行参数;如果它们大于0,只需在此处运行(缩写)代码逻辑。在代码的最后,只需运行Application.Exit()
,如下所示:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
If My.Application.CommandLineArgs.Count > 0 Then
' Execute (abbreviated) code logic
' When finished, exit the program
Application.Exit()
End If
End Sub
如果您依赖于用户界面,这也可以使您的代码更清晰,更实用,因为您仍然可以访问用户原本可以修改的表单元素的值 - 但是没有显示的表单屏幕(除非你使用MsgBox
等提示它。)
这也适用于计划任务,因为用户可以使用用户界面手动运行它们,而程序执行时不会通过计划任务显示。
答案 2 :(得分:0)
上面是Chad解决方案的后续内容,我使用How to have an invisible start up form?中定义的步骤来避免显示我的表单。
简而言之,创建一个在Form1_Load:
之前启动的Overrides子例程这对我有用:
Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
If Not Me.IsHandleCreated Then
Me.CreateHandle()
value = False
MyBase.SetVisibleCore(value)
Else
Exit Sub
End If
If My.Application.CommandLineArgs.Count > 0 Then
MsgBox("Argument Sensed!")
' Execute (abbreviated) code logic
' When finished, exit the program
Me.Close()
Application.Exit()
Else
MyBase.SetVisibleCore(True)
End If
End Sub