【问题标题】:Optionally launch form in VB.Net console application可选择在 VB.Net 控制台应用程序中启动表单
【发布时间】:2014-09-01 14:30:39
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    对于 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
    

    【讨论】:

    • 太好了,谢谢。有没有办法隐藏或取消现在也出现的控制台窗口?
    • 一种方法是将项目设置为 WinForms 应用程序,您可以处理命令行,并且在 CLI/控制台模式下从不显示表单。
    【解决方案2】:

    我在您的评论中看到,您希望删除在使用当前建议的解决方案运行程序的表单版本时出现的控制台窗口。由于缺乏声誉,我无法发表评论,所以我会给出一个完整的答案。

    考虑从相反的角度来解决这个问题:如果您将程序编写为表单应用程序,默认情况下打开它会显示表单。但是在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 或类似的方式提示它)。

    这对于计划任务也非常有效,因为用户可以使用用户界面手动运行它们,而程序执行时不会通过计划任务看到。

    【讨论】:

    • 对,所以如果参数计数 > 0 则执行操作并退出,否则继续执行表单加载事件。谢谢!
    • 当提供命令行参数时,我确实看到表单加载在退出之前会快速闪烁。不知道我对此有多好,但这可能是不可避免的。
    • 我正在玩立即触发 Me.Hide() 和类似(但不成功)的 MyBase.Load 快速修复。也许你可以用这样的东西变得坚韧不拔(尽管你可能会发现自己完全禁用动画,我不确定你是否想这样做):link
    • 我自己试过了。问题是表单已经在屏幕上加载和绘制。 loading 之类的事件将是您可以取消表单加载的理想选择。不确定是否存在这样的事情。似乎应该有一个干净的解决方案。虽然我不记得应用程序,但我知道我以前见过这种行为(可选地加载 GUI)。谢谢。
    • 同意,我在寻找“BeforeLoad”或类似的东西,但我找到的最接近的是“Shown”,这不是我们想要的(仍在绘制之后)。
    【解决方案3】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 2012-11-19
      • 2017-05-21
      • 2010-10-30
      • 2017-09-15
      相关资源
      最近更新 更多