2011-10-14 48 views
2

我們有第三方登錄對話框,如果通過命令行參數傳入登錄數據,它將跳過登錄提示。當從主要第三方軟件啓動應用程序時使用此功能。如何從代碼中清除應用程序的CommandLineArgs?

我正在編寫的自定義應用程序應該爲用戶提供一個按鈕來更改他們的登錄信息,但是由於該應用程序是通過在命令行參數中提供的登錄信息啓動的,因此單擊按鈕時不會出現登錄對話框。

是否可以從代碼中清除或重置Environment.GetCommandLineArgs()

編輯

我結束了簡單的重新啓動,以啓動時如果登錄信息在命令行之前存在的應用程序。這使得第三方登錄對話框實際顯示出來,而不是自動使用命令行參數中提供的登錄信息。

我接受Jim's answer,因爲我覺得這是對我的問題最完整的答案,不過Oded's answer也是一個可行的選擇。

回答

3

你問的問題不能在.NET中完成,因爲Environment類緩存命令行,並且沒有屬性訪問器來設置它。 (更正確地說,啓動代碼將命令行和Environment.CommandLine調用緩存到運行時以獲取該緩存值。)

在原生Windows應用程序中,GetCommandLine() API函數返回一個指向操作系統呈現的命令行的指針到程序。程序可以調用CommandLineToArgvW將命令行解析爲C和C++程序員熟悉的標準argvargc參數。

Environment類使用類似的東西。當您致電Environment.GetCommandLineArgs時,它會訪問Environment.CommandLine屬性,然後調用窗口函數CommandLineToArgvW來解析命令行。但Environment.CommandLine未從GetCommandLine()獲得其值。相反,程序在啓動時會獲取Windows命令行(通過調用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都返回相同的字符串次,而第二次您撥打​​時,您將收回字符串ham and swiss on rye

即使上述沒有的工作,也不能保證它能解決您的問題。第三方控件可能會解析命令行,緩存登錄信息,並且永遠不會再分析命令行。

+0

+ 1作爲一個很好的解釋,儘管可惜它不能幫助我,因爲第三方對話框使用'Environment.GetCommandLineArgs()',它保持不變。 – Rachel

1

您可以使用Process.Start啓動應用程序的新實例,提供新憑據作爲參數並退出當前實例。

+0

我不想重新啓動新實例,因爲我不想丟失現有實例。該登錄不僅提供用戶驗證訪問的憑證,還提供其連接的數據庫。我的主要興趣是獲取他們連接的數據庫,並驗證他們是否有權訪問該數據庫。 – Rachel

+1

@Rachel - 我明白,但清除命令行參數是不可能的。該應用程序是通過特定的命令行啓動的,因此無法更改它... – Oded

+0

因此,一旦應用程序與它們一起啓動,就無法清除命令行參數? – Rachel

0

添加額外的命令行參數以指示此次要條件。例如,一個參數可以是ShowLogin。如果爲true,那麼命令行參數將預填充登錄對話框,並且用戶可以根據需要更新那裏的信息。如果爲false,則參數將用於自動登錄而不顯示對話框。

+0

但是這是一個第三方登錄對話框,據推測,OP無法控制辦法。 –

+0

@Jim - Thx爲了澄清,如果他們可以在另一端改變它,我認爲這將是最佳的,否則我認爲Oded的解決方案可能是最好的。 –

+0

吉姆是對的,我無法控制第三方對話框 – Rachel

相關問題