【问题标题】:How to run a console application without showing the console window如何在不显示控制台窗口的情况下运行控制台应用程序
【发布时间】:2014-02-19 23:33:58
【问题描述】:

我编写了一个包含以下子主程序的应用程序:

 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 窗体应用程序”。由于上述原因,我不想这样做。 (我无法在 winforms 启动情况下使用 application.run(f),因为我遇到了线程错误。

我需要知道如何隐藏控制台窗口,或者如何编写将启动其他三种表单之一的主菜单(但要使它们成为启动表单)。

任何帮助将不胜感激......

【问题讨论】:

  • 详述I get a threading error
  • 以上是“在单个线程上启动第二个消息循环不是有效操作”,这是我在 winforms 应用程序时得到的,但在控制台或服务应用程序时不是。
  • 对,但请参阅下面的答案。如果您从不同的消息循环启动它是可能的

标签: vb.net visual-studio


【解决方案1】:

试试:

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

它有一个副作用是窗口将被显示然后立即隐藏

变态

【讨论】:

  • 再一次,我认为将其设为 Windows 服务类型会更好,因为窗口永远不会那样显示。不过感谢您的建议。
  • 谢谢,这很好用。我无法使用其他解决方案,因为我没有 IDE 和记事本程序。因此我无法更改项目属性,它始终是控制台 Application 。这个答案最接近原始问题。
【解决方案2】:

“或者如何编写将启动其他三种表单之一的主菜单(但使它们成为启动表单)。”

从一个标准的 WinForms 项目开始并使用Application.Startup() 事件。从那里您可以检查您的启动参数,然后通过将所需实例分配给“My.Application.MainForm”来动态更改启动表单。这将导致该表单加载,就好像它是最初分配给“启动表单”条目的表单一样。

单击项目 --> 属性 --> 应用程序选项卡 --> “查看应用程序事件”按钮(右下角;向下滚动)。 将左侧下拉菜单从“(General)”更改为“(MyApplication Events)”。 将 Right 下拉菜单从“Declarations”更改为“Startup”。

简化代码:

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

【讨论】:

  • 太好了,效果很好。我发现将应用程序类型更改为“服务”也可以,但随后遇到了一些布局问题,因此我将使用您的出色建议。
【解决方案3】:

只需转到Project Properties&gt; Application&gt; Application Type&gt; 并选择Windows Forms Application

此时您的ConsoleApplication 完全不可见,没有用户界面。

【讨论】:

  • 这将起作用,只是它要求它不是我在原始问题中指定的 application.run 命令的表单应用程序。但是我发现将应用程序类型更改为“Windows 服务”确实有效。我更喜欢 Idle Mind 的答案,因为这样它就可以作为一个 winforms 应用程序。
  • @Tim 这对于 WinForms 中的 Application.Run 并不完全正确。您可以在新线程上使用 Application.Run
  • 优秀的答案!同时删除不需要的引用。除了控制台类型之外,只需要 system.windows.forms。
【解决方案4】:

我只想添加另一个解决方案,尽管 Idle_Mind 已经提供了一个很好的解决方案。这表明您可以在 WinForms 应用程序中使用Application.Run(Form)

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

【讨论】:

    猜你喜欢
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2011-04-04
    • 2023-03-24
    • 1970-01-01
    • 2019-01-18
    相关资源
    最近更新 更多