2011-06-29 56 views
-1

我正在製作一個使用Windows Shell集成的程序,並且我所做的註冊表更改如下: 例如,對於.txt,我看到HKEY_CLASSES_ROOT\.txt > (Default)的值爲txtfile。我在HKEY_CLASSES_ROOT\txtfile\shell中添加了密鑰myprogram > (Default),其值爲Open with MYPROGRAM。到myprogram我加command > (Default)的值爲*path-to-my-program* %1。現在,當我右鍵單擊.txt文件時,可以選擇使用我的程序打開它。Windows Shell與多個文件集成

但是,當我這樣做有多個.txt文件在Windows打開我的計劃中有許多次,每次另一個文件作爲參數與。但是我想用所有的文件打開我的程序一次。有沒有辦法改變註冊表中的東西?

如果沒有,我還沒有找到一種方法,使可多次打開,並結合他們都一個一個節目,所以我也能做到這樣,如果有人可以幫我一下吧。順便說一句,我正在用C#編寫這個程序。

回答

0

你必須讓你的應用程序「單實例」。 這樣的事情應該做的伎倆: (未經測試的代碼,僅供參考)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Threading; 

namespace YourApp 
{ 
    class Program 
    { 
     [DllImport("user32.dll")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     static extern bool SetForegroundWindow(IntPtr hWnd); 

     [STAThread] 
     static void Main() 
     { 
      bool createdNew = true; 
      using (Mutex mutex = new Mutex(true, "MyApplicationName", out createdNew)) 
      { 
       if (createdNew) 
       { 
        Application.EnableVisualStyles(); 
        Application.SetCompatibleTextRenderingDefault(false); 
        Form1 frm = new Form1(); 
        frm.SetNewData("send command line here"); 
        Application.Run(frm); 
       } 
       else 
       { 
        Process current = Process.GetCurrentProcess(); 
        foreach (Process process in Process.GetProcessesByName(current.ProcessName)) 
        { 
         if (process.Id != current.Id) 
         { 
          SetForegroundWindow(process.MainWindowHandle); 
          // send message to that form or use .Net remoting 
          break; 
         } 
        } 
       } 
      } 
     } 
    } 
} 

對於一個更好的例子看this CodeProject上的解決方案。

+0

你的代碼並沒有真正的工作,但CodeProject的例子,謝謝。 – Cokegod

0

來處理這個標準的方法是使用一個互斥體,以確保只有你的程序的單個實例上運行。然後,當shell嘗試啓動一個新實例來打開每個文件時,新實例只是將消息傳遞給已經運行的實例,並讓它打開文件。

0

一種可能的選擇是檢查程序的另一個實例是否已經在運行。如果是這樣,您將文件路徑傳遞給該實例以打開。對於程序間的通信,你可以使用任何你喜歡的,例如:.NET遠程,命名管道,DDE,自定義窗口消息等。

0

這是默認的。你已經告訴shell當單擊'使用MYPROGRAM打開'時爲每個選定的文件調用應用程序%1。

解決這個問題的最簡單的方法就是讓你的應用程序單個實例,併發送選擇另一文件時已經運行消息實例。這樣,啓動應用程序的一個實例以打開一個文件,並收到打開每個其他文件的請求。這是怎麼回事是用C++

一般完成,如果你看一下Developer Documentation也有使用DDE的建議。我不知道C#中DDE的可訪問性,它的使用已被棄用。

+0

DDE僅適用於GUI應用程序。 IE瀏覽器。 .NEt遠程處理更好,因爲它適用於控制檯和GUI應用程序。 –

+0

我只是建議它,因爲它是在文檔中陳述。通常,我使用單個實例和每個文件的後續消息。我不傾向於使用DDE,因爲它很長一段時間被列爲「不推薦」。 – Petesh