2014-09-01 3 views
0

Так я установил мое приложение к приложению типа консоли и направил его в модуль, содержащий только Sub Main, т.е.Необязательно форма запуска в консольном приложении VB.Net

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), а затем закрывается. Что я делаю не так или нет?

Если вы не хотите давать мне ответ, я был бы счастлив, если бы он был направлен в правильном направлении. Я не ожидаю, что кто-нибудь просто ответит. Мне также нужно учиться.

Спасибо!

ответ

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 или такого).

Это также очень хорошо работает для запланированных задач, так как пользователь может запускать их вручную с помощью пользовательского интерфейса, в то время как программа выполняется без видимости через запланированную задачу.

+0

Правильно, поэтому, если аргумент count> 0, тогда перейдите в файл и выйдите, иначе продолжите событие загрузки формы. Благодаря! – Steve

+0

Я вижу, что появляется быстрое мерцание загрузки формы до ее выхода при предоставлении аргумента командной строки. Не уверен, как хорошо я с этим, но это может быть неизбежным. – Steve

+1

Я играл с немедленным увольнением Me.Hide() и подобных (но безуспешных) быстрых исправлений для MyBase.Load.Возможно, вы можете получить нечто вроде этого (хотя вы можете полностью отключить анимацию, и я не уверен, что вы хотите сделать): [link] (http://stackoverflow.com/questions/14001694/vb-net -disable-fade-in-for-forms) – Chad

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 
+0

Отлично, спасибо. Есть ли способ скрыть или иным образом отказаться от окна консоли, которое теперь также появляется? – Steve

+1

Один из способов - установить проект как приложение WinForms, вы можете обработать командную строку и просто не показывать форму в режиме CLI/console. – Plutonix

0

Вид следующего решения Чада выше Я использовал шаги, определенные в How to have an invisible start up form?, чтобы не показывать мою форму.

Короче говоря, создать подпрограмму Overrides, которая получает запущен до Form1_Load:

Это работало для меня:

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