2011-06-29 10 views
-1

Windowsシェル統合を使用しているプログラムを作成しています。これらのレジストリの変更は次のとおりです。 たとえば、.txtの場合、HKEY_CLASSES_ROOT\.txt > (Default)の値はtxtfileです。 HKEY_CLASSES_ROOT\txtfile\shellmyprogram > (Default)というキーを追加します。値はOpen with MYPROGRAMです。 〜myprogramcommand > (Default)に値*path-to-my-program* %1を追加します。今すぐ右クリックして.txtファイルを開くと、プログラムで開くことができます。Windowsシェル複数のファイルとの統合

しかし、複数の.txtファイルでこれを行うと、Windowsは別のファイルを引数として何度も何度も自分のプログラムを開きます。しかし、私はすべてのファイルを一度に開いて、多くの議論をしたい。レジストリの内容を変更することでそれを行うオプションはありますか?

もしそうでなければ、私は複数回開いてすべてを1つにまとめることができるプログラムを作る方法も見つけられなかったので、誰かがそれを手伝うことができるなら、そうすることもできます。私はC#でこのプログラムを作っています。

答えて

0

アプリケーションを「単一インスタンス」にする必要があります。より良い例this CodeProjectのソリューションを参照してください(単なる参考のために、未テストコード)

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; 
         } 
        } 
       } 
      } 
     } 
    } 
} 

を :このような 何かトリックを行う必要があります。

+0

あなたのコードは実際には機能しませんでしたが、CodeProjectの例はありがたいです。 – Cokegod

0

これを処理する標準的な方法は、ミューテックスを使用してプログラムのインスタンスを1つだけ実行することです。次に、シェルが新しいインスタンスを起動して各ファイルをオープンしようとすると、新しいインスタンスはメッセージをすでに実行中のインスタンスに渡し、ファイルを開くことができます。

0

1つの可能なオプションは、プログラムの別のインスタンスがすでに実行されているかどうかを確認することです。その場合は、ファイルパスをそのインスタンスに渡して開きます。プログラム間の通信のためには..あなたは、など例えば:.NETリモーティング、名前付きパイプ、DDE、カスタムウィンドウメッセージを、好きなデフォルトだ

0

を使用することができます。 「MYPROGRAMで開く」をクリックすると、選択されたファイルごとにアプリケーション%1が呼び出されたことをシェルに伝えました。

これを修正する最も簡単な方法は、アプリケーションを単一インスタンスにし、別のファイルが選択されているときにすでに実行中のインスタンスにメッセージを送信することです。このようにして、アプリケーションの1つのインスタンスが起動して1つのファイルを開き、他の各ファイルを開く要求を受け取ります。あなたはDeveloper Documentationを見ればこれはDDEを使用するための推奨事項もあり、それは一般的にC++

を使用して達成される方法です。私はどのようにアクセス可能なDDEがC#の中から来たのかわかりません。その使用は推奨されていません。

+0

DDEはGUIアプリケーション専用です。つまりコンソールやGUIアプリケーションで動作するため、リモート処理が優れています。 –

+0

ドキュメントに記載されているとおり、私はそれを示唆していました。一般的には、ファイルごとに1つのインスタンスとそれに続くメッセージを使用します。私は長い間「推奨されていない」としてリストされているので、DDEを使用する傾向はありません。 – Petesh