2014-09-01 89 views
0

所以我把我的應用程序控制臺應用程序類型,並指出只包含子主要的模塊,即選擇啓動形式

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 2014-09-01 15:10:56

+0

在提供命令行參數時,我確實看到它在退出前有快速閃爍的窗體加載。不知道我對此有多好,但它可能是不可避免的。 – Steve 2014-09-01 15:23:45

+1

我正在玩立即爲MyBase.Load發射Me.Hide()和類似(但不成功)的快速修復。也許你可以堅持這樣的東西(儘管你可能會發現自己完全禁用動畫,我不知道你是否想這樣做):[link](http://stackoverflow.com/questions/14001694/vbnet -disable-fade-in-for-forms) – Chad 2014-09-01 15:32:16

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 2014-09-01 14:37:31

+1

一種方法是將項目設置爲WinForms應用程序,您可以處理命令行,並且在CLI /控制檯模式下從不顯示窗體。 – Plutonix 2014-09-01 14:58:54

0

上述乍得解決方案的後續類型我使用了How to have an invisible start up form?中定義的步驟來避免顯示我的表單。

總之,創建一個被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