Steve
Steve

Reputation: 579

Optionally launch form in VB.Net console application

So I've set my application to a console type application and pointed it to a module containing just Sub Main, i.e.

    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

Ideally if no arguments are supplied then the program would simply launch the primary form. The goal is to make this program (optionally) script-able from the command line. If arguments are supplied then the application form is not loaded and processes its features based off the command line arguments supplied.

As it is now, the program runs, briefly launches the form (frmMain) and then closes. What am I doing wrong or missing?

If you're not keen on giving me the answer, I'd be happy to be pointed in the right direction also. I don't expect anyone to just supply answers. I need to learn also.

Thanks!

Upvotes: 0

Views: 2387

Answers (3)

Torquin
Torquin

Reputation: 1

Kind of a follow-on to Chad's solution above I used the steps defined in How to have an invisible start up form? to avoid showing my form.

In short, create an Overrides subroutine that gets launched before Form1_Load:

This worked for me:

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

Upvotes: 0

Chad
Chad

Reputation: 1549

I see in your comment that you'd like to remove the console window that appears when running the form version of the program with the solution currently proposed. I cannot comment due to lack of reputation, so I will make this a full-fledged answer.

Consider approaching this from an inverse perspective: if you write the program as a forms application, opening it by default will bring up the form. But in the Form1_Load event, check the command line arguments; if they are greater than 0, simply run your (abbreviated) code logic here. At the end of the code, simply run Application.Exit(), like so:

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

This can also make your code cleaner and more practical if you're relying on a user-interface, because you can still access the values of form elements that the user would otherwise be modifying - but without the form showing on the screen (unless you prompt it to with a MsgBox or such).

This also works very nicely for Scheduled Tasks, as the user can run them manually with a user-interface, while the program executes without being visible via a scheduled task.

Upvotes: 1

For Winforms, you need to 'run' the App object, passing a form to use:

 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

Upvotes: 2

Related Questions