0

我发现可以使用 CMD 窗口来启动典型的 NET GUI 应用程序。
但不是那么干净,有一些问题。

这是我的示例代码:

Public Class main_form

Private Declare Function AttachConsole Lib "kernel32.dll" (ByVal dwProcessId As Int32) As Boolean
Private Declare Function FreeConsole Lib "kernel32.dll" () As Boolean
Dim mykey As String = "A01F-FFB4-0402"


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    If My.Application.CommandLineArgs.Count > 0 Then
        If AttachConsole(-1) Then
            Dim kill_Me As Boolean = False
            Dim cArgs() As String = GetCommandLineArgs()

            For c As Integer = 0 To cArgs.Length - 1
                cArgs(c) = cArgs(c).ToLower()

                If cArgs(c) = "getkey" Then
                    Console.WriteLine(mykey)
                    kill_Me = True
                End If
            Next

            FreeConsole()
            If kill_Me Then End 

            If (MessageBox.Show( _
                "Asked command not present." & NewLine & "Start program with GUI normally?", "", _
                 MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = _
                 DialogResult.Cancel) _
            Then End
        End If
    End If

请忽略安全问题,这只是一个示例。就像这里的人得出的结论一样,问题在于终止控制台。这是向其发送密钥“ENTER”的方法,但这显然不是一个好的解决方案。

如果我从 CMD 窗口启动示例程序: c:\mydir>myprogram.exe getkey|more 那么控制台的行为比没有开关“更多”更“自然”。

1) 但是,如果我使用 c:\mydir>myprogram.exe getkey: 启动一个程序:VBNET 是否可以在执行之前将关键字“|more”添加到命令行参数“getkey”,以便程序将执行“getkey|more”只有“getkey”?

2) 像示例中所示的那样,在表单的 _Load 处理程序中仅使用命令“End”来终止 GUI 程序是否可以接受?我尝试 Application.Exit() 和 Me.Close() 程序表现不佳的地方。

4

1 回答 1

2

您的应用程序(无论是 .Net 还是本机,都无所谓)可以是控制台应用程序或 GUI 应用程序,但不能同时是. 比我聪明的人之前已经讨论过这个问题:如何编写可以作为控制台或 GUI 应用程序运行的程序

每个 PE 应用程序在其头文件中包含一个字段,该字段指定它被设计为在哪个子系统下运行。您可以说 IMAGE_SUBSYSTEM_WINDOWS_GUI 将自己标记为 Windows GUI 应用程序,或者您可以说 IMAGE_SUBSYSTEM_WINDOWS_CUI 说您是控制台应用程序。如果您是 GUI 应用程序,那么程序将在没有控制台的情况下运行。

子系统决定内核如何为程序准备执行环境。如果程序被标记为在控制台子系统中运行,那么内核会将程序的控制台连接到其父级的控制台,如果父级没有控制台,则创建一个新的控制台。(这是一个不完整的描述,但细节与讨论无关。)另一方面,如果程序被标记为作为 GUI 应用程序运行,那么内核将在没有任何控制台的情况下运行程序。

因此,如果您有一个 GUI 应用程序,那么您无法将应用程序 stdin/stderr 连接到您的控制台,因此管道将无法工作,因此,诸如cat, more,之类的东西对于 GUI 应用程序less来说tee都是不可行的。更不用说 CMD 控制台不会等待您的应用程序。

尽量不要作弊。对 GUI 使用 GUI,对控制台使用控制台应用程序。在库中共享公共代码。

于 2013-10-25T09:11:53.710 回答