2014-02-18 7 views
1

Я написал заявление с следующими подпунктами основные:Как запустить консольное приложение без отображения окна консоли

Public Sub Main() 
    Dim Value As String() = Environment.GetCommandLineArgs 
    Dim F As Form 
    Select Case Value.Last.ToLower 
    Case "-character" 
     F = New frmCharacterSheet 
    Case "-viewer" 
     F = New frmClient 
    Case Else 
     F = New frmCombat 
    End Select 
    Application.Run(F) 
End Sub 

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

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

Я искал ответ, но большинство решений «переключитесь на приложение форм Windows». Я не хочу этого делать по этой причине. (Я не могу использовать application.run (f) в ситуации запуска winforms, потому что получаю ошибку потоковой передачи.

Мне нужно знать, как скрыть окно консоли, или, альтернативно, как закодировать главное меню, которое запустит один из трех других форм (но делает их форму запуска)

Любая помощь будет оценена ....

+0

Elaborate на 'Я получаю потоковую error' – djv

+0

http://0.tqn.com/d/visualbasic/1/0/_/Z/formappclass-2.gif – Tim

+0

Вышеуказанное«начало второй цикл сообщений в одном потоке не является допустимой операцией », что я получаю, когда это приложение winforms, но не когда консоль или служба. – Tim

ответ

3

"или, альтернативно, как закодировать главное меню, которое запустит одну из трех других форм (но сделает их формой запуска)".

Начало со стандартом WinForms Проект и использование события Application.Startup(). Оттуда вы можете проверить свои параметры запуска, а затем динамически изменить форму автозагрузки, назначив желаемый экземпляр «My.Application.MainForm». Это приведет к загрузке этой формы, как если бы она была первоначально назначена записи «Автозагрузка».

Нажмите «Проект» -> «Свойства» -> «Приложение» -> «Просмотр приложений» (внизу справа, прокрутите вниз). Измените выпадающее меню Left на «(Общее)» на «(События MyApplication)». Измените правое выпадающее меню с «Объявления» на «Запуск».

упрощенный код:

Namespace My 

    ' The following events are available for MyApplication: 
    ' 
    ' Startup: Raised when the application starts, before the startup form is created. 
    ' Shutdown: Raised after all application forms are closed. This event is not raised if the application terminates abnormally. 
    ' UnhandledException: Raised if the application encounters an unhandled exception. 
    ' StartupNextInstance: Raised when launching a single-instance application and the application is already active. 
    ' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected. 
    Partial Friend Class MyApplication 

     Private Sub MyApplication_Startup(sender As Object, e As ApplicationServices.StartupEventArgs) Handles Me.Startup 
      If True Then 
       My.Application.MainForm = New Form1 ' <-- pass your desired instance to MainForm 
      End If 
     End Sub 

    End Class 

End Namespace 
+0

Отлично, он отлично работает. Я обнаружил, что изменение типа приложения на «сервис» также работает, но затем столкнулось с некоторыми проблемами макета, и поэтому я буду использовать ваше превосходное предложение. – Tim

2

Try:.

Private Declare Auto Function ShowWindow Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nCmdShow As Integer) As Boolean 
Private Declare Auto Function GetConsoleWindow Lib "kernel32.dll"() As IntPtr 
Private Const SW_HIDE As Integer = 0 

Sub Main() 
    Dim hWndConsole As IntPtr 
    hWndConsole = GetConsoleWindow() 
    ShowWindow(hWndConsole, SW_HIDE) 
    'continue your code 
End Sub 

Это имеет побочный эффект, что окно будет показывается, а затем сразу же скрывается

Вальтера

+0

Опять же, я думаю, что сделать его типом службы Windows лучше, поскольку окно никогда не будет отображаться таким образом. Спасибо за предложение. – Tim

+0

Спасибо, это отлично работает. Я не мог использовать другие решения, поскольку у меня нет IDE и программы из блокнота. Поэтому я не мог изменить свойства проекта, это всегда консольное приложение. Этот ответ наиболее близко отвечает на исходный вопрос. – Shodan

1

Просто зайдите в Project Properties> Application> Application Type> и выберите Windows Forms Application

В этот момент ваш ConsoleApplication оказывается полностью невидимым, без пользовательского интерфейса.

+0

Это будет работать, за исключением того, что оно требует, чтобы оно не было формальным приложением для команды application.run, указанной в моем первоначальном вопросе. Однако я обнаружил, что изменение типа приложения на «службу Windows» действительно работает. Я предпочитаю ответ Idle Mind, хотя, потому что тогда он может оставаться как приложение winforms. – Tim

+0

@ Это не совсем верно в отношении Application.Run в WinForms. Вы можете использовать Application.Run в новом потоке – djv

0

Я просто хочу добавить еще одно решение, хотя Idle_Mind уже предоставил отличную один. Это показывает, что вы можете использовать Application.Run(Form) внутри приложения WinForms.

Public Class Form1 

    Private Shared applicationThread As New Threading.Thread(AddressOf Main) 

    Private Shared Sub Main() 
     Dim myForm As Form 
     Dim config = 2 ' if 3, will run Form3 
     Select Case config 
      Case 2 
       myForm = New Form2 
      Case 3 
       myForm = New Form3 
      Case Else 
       MessageBox.Show("Bad config!") 
       Exit Sub 
     End Select 
     Application.Run(myForm) 
    End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     applicationThread.Start() 
     ' immediately dispose Form1 so it's not even shown 
     Dispose() 
    End Sub 

End Class 
Смежные вопросы