我如何从代码中清除应用程序的CommandLineArgs

本文关键字:清除 应用程序 CommandLineArgs 代码 | 更新日期: 2023-09-27 18:11:29

我们有一个第三方登录对话框,如果通过命令行参数传递登录数据,它将跳过登录提示符。当应用程序从主第三方软件中启动时使用。

我正在编写的自定义应用程序应该为用户提供一个按钮来更改他们的登录信息,但是由于应用程序是在命令行参数中提供的登录信息启动的,当按钮被点击时,登录对话框从未出现。

是否可以从代码中清除或重置Environment.GetCommandLineArgs() ?

编辑

如果命令行中存在登录信息,我最终只是在启动之前重新启动应用程序。这使得第三方登录对话框实际显示,而不是自动使用命令行参数中提供的登录信息。

我接受Jim的答案,因为我觉得这是对我的问题最完整的答案,尽管Oded的答案也是一个可行的选择。

我如何从代码中清除应用程序的CommandLineArgs

您所要求的不能在。net中完成,因为Environment类缓存命令行并且没有属性访问器用于设置它。(更准确地说,启动代码缓存命令行,Environment.CommandLine调用运行时获取缓存的值。)

在本地Windows应用程序中,GetCommandLine() API函数返回一个指针,该指针指向操作系统提供给程序的命令行。程序可以调用CommandLineToArgvW将命令行解析为C和c++程序员所熟悉的标准argvargc参数。

Environment类使用类似的东西。当您调用Environment.GetCommandLineArgs时,它访问Environment.CommandLine属性,然后调用windows函数CommandLineToArgvW来解析命令行。但是Environment.CommandLine不能从GetCommandLine()得到它的值。相反,程序在启动时获得Windows命令行(通过调用GetCommandLine()),然后保存它。

这很不幸,因为可以修改GetCommandLine返回的值,如下面的代码片段所示:

[DllImport("kernel32")]
static extern IntPtr GetCommandLine();
static void DoIt()
{
    IntPtr pcmdline = GetCommandLine();
    Console.WriteLine("Environment.CommandLine = {0}", Environment.CommandLine);
    string realCmdLine = Marshal.PtrToStringAnsi(pcmdline);
    Console.WriteLine("realCmdLine = {0}", realCmdLine);
    Console.WriteLine("** Modify command line");
    // Modify the command line
    byte[] bytes = Encoding.ASCII.GetBytes("ham and swiss on rye'0");
    Marshal.Copy(bytes, 0, pcmdline, bytes.Length);
    Console.WriteLine("Environment.CommandLine = {0}", Environment.CommandLine);
    pcmdline = GetCommandLine();
    realCmdLine = Marshal.PtrToStringAnsi(pcmdline);
    Console.WriteLine("realCmdLine = {0}", realCmdLine);
}

如果你运行它,你会发现Environment.CommandLine两次都返回相同的字符串,而第二次调用GetCommandLine,你会返回字符串ham and swiss on rye

即使上面的有效,也不能保证它能解决你的问题。第三方控件可能会解析命令行,缓存登录信息,并且再也不会解析命令行。

您可以使用Process.Start启动应用程序的新实例,提供新的凭据作为参数,并退出当前实例。

添加额外的命令行参数来指示此次要条件。例如,参数可以是ShowLogin。如果为真,则命令行参数预先填充登录对话框,用户可以根据需要更新这些信息。如果为false,则使用参数自动登录而不显示对话框。