2013-08-21 31 views
8

我已經加入我的應用程序到Windows的右鍵菜單與註冊表提供多個文件路徑用右鍵單擊

「C://myapp.exe‘的幫助下%1’

我可以使用下面的代碼來獲得所選擇的文件在MessageBox路徑。

static void Main(string[] args) 
{ 
    foreach (string path in args) 
    { 
     MessageBox.Show(path); 
    } 
} 

這是好,如果我想打開一個文件,但如果我選擇多個文件,它運行我的應用程序的多個實例。我只需要單個實例中所有選定文件的路徑。任何人都可以給我一個如何做到這一點的想法?

+0

最新問題?你需要傳入多個參數? – Sayse

+0

我不知道從「選擇,右鍵單擊,啓動,選擇另一個,右鍵單擊,啓動」中區分「多個選擇,單擊右鍵,啓動」 - 所以如果你很高興,在這兩種情況下,因爲只有一個實例正在運行,所以您希望實現一個「單實例應用程序」 - 嘗試搜索這三個詞加上c#。 –

+1

[打開所有文件時用戶右鍵單擊並選擇「打開方式」](http://stackoverflow.com/questions/3158312/open-all-files-when-user-right-clicks-and-selects-打開) –

回答

0

首先,我想告訴你關於你的方法的最重要的事情是,絕對不可能通過你使用註冊表製作的右鍵單擊快捷方式來獲得多個文件路徑。但是,有一些解決方法這種方法可能有幫助;

  • 如果你真的需要這種簡單的,那麼你就必須處理使用Mutex Class。這,如果你設法限制您的應用程序實例使用Mutex.To得到這種方法工作單挑可以提供你一些幫助應用程序實例對於你來說,你必須將所有先前實例的命令行參數傳遞給最後一個實例。

我剛纔解釋的方法涉及到很多的代碼在啓動過程中獲得的所有文件路徑,但第二種方法容易是最適合這種情況,但它是一個有點困難的,需要的東西比你的可執行更多。

  • 第二個(推薦)的方式,我說的是有點棘手,因爲它涉及到創建與應用程序來獲取所有文件路徑的附加組件,但它可以確保您收到一氣呵成的所有路徑(無多個實例)。第二種方法可以標題爲Shell Extensions。爲了解釋這種方法,讓我解釋一些先決條件(並且如果您已經知道它們,請不要猶豫,跳過它們).Shell擴展名是COM Servers,它們在用戶的計算機上註冊了一些他們可以處理的特定類型的文件,如的.cs的.csproj(兩者都註冊到Visual Studio中默認開啓).Shell擴展也被稱爲上下文菜單處理。一個註冊的外殼擴展或文本菜單句柄 得到儘快文件擴展名爲註冊通過它從Windows資源管理器的上下文菜單中右鍵單擊來打開。
    廣泛地說,外殼擴展或上下文菜單處理程序是一個註冊的COM服務器,它在用戶的計算機中以Dynamic Link Library的形式退出,如果註冊的文件類型接收到右鍵單擊選擇或雙擊,則調用其功能。
    因此,我想你已經足夠爲Shell擴展開創一個良好的開端。 Here是一個很好的一步一步的文章,爲您提供一個體面的起點中途。

我想這會幫助你實現你的需要。如果還有什麼,請告訴我。

0

雖然它相當複雜,但我知道Shell Extension Handler可以解決這個問題。
How to Write Windows Shell Extension with .NET Languages

我寫的這一個打開時,用戶可以右擊一個特定的文件類型Windows窗體應用程序。它也適用於多個文件。

祝你好運!

1

非編程變通,將所有路徑同時複製如下(以Windows 7的測試):

  1. 選擇您想要的文件。
  2. Shift +右鍵單擊。
  3. 單擊「複製爲路徑」(它顯示爲一個附加選項!)。

所有路徑按預期被複制!

0

您的應用程序很可能不運行其自身的多個實例,因爲您告訴foreach循環顯示每個路徑的消息框,所以您只是獲取多個消息框。您需要操縱一個字符串來包含所有路徑,然後將它們插入到消息框中以顯示。

FROM

static void Main(string[] args) 
{ 
    foreach (string path in args) 
    { 
     MessageBox.Show(path); 
    } 
} 

TO

static void Main(string[] args) 
{ 
    string paths = ""; 
    foreach (string path in args) 
    { 
    paths += path + Environment.NewLine; 
    } 
    MessageBox.Show(path); 
} 
1

我嘗試過了,在應用程序運行每個選定文件的新實例。我甚至試圖將「%2」「%3」等添加到註冊表命令中,這也不起作用。

如果真的有必要對所有文件運行一個實例,也許你可以設置你的應用程序與從WindowsFormsApplicationBase派生的類,設置IsSingleInstance性能和覆蓋OnStartupNextInstance(沒有聯繫到,因爲我的名聲不允許超過2個鏈接)

+0

這是一個很好的例子,用於[單個實例應用程序在c#](http://www.codeproject.com/Articles/12890/Single-Instance-C-Application-for-NET) –

+0

是的,這是要走的路。檢測新的應用程序實例並處理這些人之間的通信毫無意義。注意:您將需要* Microsoft.VisualBasic.dll *的引用和'使用Microsoft.VisualBasic.ApplicationServices;' –