winforms 在不打开WinForm的情况下传递CMD行参数-输出到现有CMD窗口

c0vxltue  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(129)

在VB .NET中,我有一个现有的应用程序,它使用WMI和Win32来提取系统信息,从收集的信息中创建一个加盐的散列,然后在WinForm中向用户显示所有内容。
我需要的是从CMD(“MyApp. exe/nogui”)捕获命令行参数的能力,并在现有的CMD窗口中只向用户输出salt散列,而不显示WinForm。
我已经做了我能想到的一切...
1.将“应用程序类型”更改为“控制台应用程序”。这是不可取的,因为控制台窗口始终显示。(并更改WinForms主题)
1.我玩了一下模块,但还是不太明白。(我不太擅长模块编码,但也许我误解了。idk...)
1.已添加For Each arg As String并使用Case指定参数(“/nogui”),但WinForm继续显示。
请帮帮忙,谢谢!
编辑:目的是让Microsoft SCCM能够捕获变量中的CMD输出。

aemubtdh

aemubtdh1#

第一步是在项目属性中禁用应用程序框架。这使您能够编写自己的Main方法,并将其用作应用程序的入口点。您可以将Main方法添加到现有启动窗体中,也可以将其放在其他位置,例如Program模块。然后更改项目属性中的Startup对象。基本上,您可以复制C#项目中Main方法的外观作为起点:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}
<STAThread>
Shared Sub Main()
    Application.EnableVisualStyles()
    Application.SetCompatibleTextRenderingDefault(False)
    Application.Run(New Form1)
End Sub

下一步是读取命令行参数,并根据该参数显示表单:

<STAThread>
Public Shared Sub Main(args As String())
    Application.EnableVisualStyles()
    Application.SetCompatibleTextRenderingDefault(False)

    If args.Any(Function(arg) String.Equals(arg, "/nogui", StringComparison.InvariantCultureIgnoreCase)) Then
        'Display output without GUI.
        Console.WriteLine("Output")
    Else
        'Display GUI.
        Application.Run(New Form1)
    End If
End Sub

注意,我已经做了一个不区分大小写的比较来匹配命令行参数。这通常更合适,但如果你愿意,你可以让它区分大小写。
这里的问题是Console.WriteLine调用在默认情况下不会实际写入WinForms应用程序的现有控制台窗口。您需要附加控制台窗口,阅读一些内容后发现您可以使用Windows API调用来完成此操作:

Private Const ATTACH_PARENT_PROCESS As Integer = -1

<Runtime.InteropServices.DllImport("kernel32.dll")>
Private Shared Function AttachConsole(dwProcessid As Integer) As Boolean
End Function

<STAThread>
Public Shared Sub Main(args As String())
    Application.EnableVisualStyles()
    Application.SetCompatibleTextRenderingDefault(False)

    If args.Any(Function(arg) String.Equals(arg, "/nogui", StringComparison.InvariantCultureIgnoreCase)) Then
        'Display output without GUI.
        AttachConsole(ATTACH_PARENT_PROCESS)
        Console.WriteLine("Output")
    Else
        'Display GUI.
        Application.Run(New Form1)
    End If
End Sub

我已经在一个.NET框架项目中测试过了,它和预期的一样工作。我还没有在.NET核心中测试过,但我相信它应该也能以同样的方式工作。

相关问题