可选择在VB.Net控制台应用程序中启动表单

时间:2014-09-01 14:30:39

标签: vb.net

所以我将我的应用程序设置为控制台类型的应用程序,并将其指向仅包含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)然后关闭。我做错了什么或错过了什么?

如果你不热衷于给我答案,我也很乐意指出正确的方向。我不指望任何人只提供答案。我也需要学习。

谢谢!

3 个答案:

答案 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