2014-09-01 86 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