Windows 用のカスタム シェル コンテキスト ハンドラーを作成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/117651

  •  02-07-2019
  •  | 
  •  

質問

問題

言語:C# 2.0以降


ユーザーが特定のファイル (私の場合は *.eic) を右クリックしたときにメニューを作成するコンテキスト ハンドラーを登録したいと考えています。これらのメニューからイベントの登録、登録解除 (クリーンアップ)、およびイベントの処理 (クリック) を行う手順は何ですか?

Windows レジストリに何か関係があるという手掛かりはありますが、.net にどれだけ多くのものがあるかを考えると、これをクリーンかつ簡単に実行する便利な方法があったとしても驚かないでしょう。

コード スニペット、Web サイトのリファレンス、コメントはすべて役に立ちます。私に投げてください。

アップデート


何人かのユーザーがコメントしているように、マネージ言語でコンテキスト メニューを作成する場合には明らかに若干の問題があります。同じ動作を実現する他の推奨方法はありますか? それとも時間をかけてこれらの回避策を検討する必要がありますか?私はそれをするのはまったく気にしません。これを可能にするために人々が努力をしてくれたことはうれしいですが、これを達成する「適切/クリーンな」方法があるかどうかを知りたいと思っています。

役に立ちましたか?

解決

マネージ言語でシェル拡張機能を作成することはやめてください。この方法を追求すると、問題が発生する可能性があることが数多くあります。

詳細については、このスレッドを参照してください。そこには、本当にそうしたい場合にそれを行うためのリンクと、それを行うことができるが、そうすべきではない理由についての賢明なアドバイスが含まれています。

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/1428326d-7950-42b4-ad94-8e962124043e/

ここで唯一の実際のツールとしてアンマネージ C/C++ に戻ります。

他のヒント

.NET Framework の異なるバージョン間で依存関係の問題が発生する可能性があるため、これは良い考えではありません。シェル拡張機能は 1 つのバージョンを予期していても、現在実行中のアプリケーションによって別のバージョンがすでにロードされている可能性があります。

このスレッド 状況の適切な要約が含まれています。

フレームワークの競合により、純粋な .NET でシェル拡張を作成するのは悪い考えだと他の人がすでに述べていますが、それでも次の点に注意する必要があります。

  1. アンマネージ側を行うサードパーティ ドライバー (Eldos または LogicNP を参照) が世の中にあり、ネイティブ ドライバーと通信するマネージ コードを作成できるため、シェル関連の CLR バージョンの競合を防ぐことができます。

  2. 最近の MSDN 記事では、Microsoft が Silverlight で使用される CoreCLR に関するこの問題を解決したと述べています。彼らは、複数のバージョンの CLR を同じプロセスで実行できるようにすることでこれを実現し、問題を解決しました。著者はさらに、Silverlight のこの修正は完全な CLR の将来のバージョンに組み込まれる予定であると述べました。(つまり、将来的には、マネージ コードでシェル拡張機能を記述することがかなり可能になるでしょう。)

以前に C# で実行したことがあります。それは本来よりもはるかに難しいものになってしまいます。ただし、定型コードを理解すれば、新しい項目を展開するのは簡単です。私はこのリンクをたどりました:

情報へのリンク

前のコメントで述べたように、マネージ言語でシェル拡張を記述するのは最善のアイデアではありませんが、まさにそれを行っているオープンソース プロジェクトを共有したいと思いました:)

シェルグルー は、実際に非常に役立つマネージド シェル拡張機能です。このソースは、C/C++ でシェル拡張機能を作成することに興味がある場合にも役立つかもしれません。

マネージ コードでのシェル拡張機能の実装に関して述べた注意点を除けば、基本的に行う必要があることは次のとおりです。

まず、IShellExtInit IContextMenu インターフェイスを実装する COM コンポーネントを C# で作成します。C# で COM コンポーネントを作成する方法について説明します。 ここ. 。必要なインターフェイスの実装方法については、「 この記事. 。この説明は C++ 実装に関するものですが、その知識を C# バージョンに適用できます。

COM コンポーネントには、Class-ID または CLSID と呼ばれる GUID があります。その ID をコンテキスト メニューのシェル拡張子としてファイル タイプに登録する必要があります。

HKEY_CLASSES_ROOT\.eic\ShellEx\ContextMenuHandlers\MyShellExt
    (Default) -> {YOUR-COMPONENTS-CLSID}

また、C# COM チュートリアルの説明に従ってコンポーネントが正しく登録されていることを確認してください。次のレジストリでそれを見つけることができます。

HKEY_CLASSES_ROOT\CLSID\{YOUR-COMPONENTS-CLSID}
    InprocServer32
        (Default) -> C:\WINDOWS\system32\mscoree.dll
        Class -> YourImplClass
        assembly -> YourAssembly, version=..., Culture=neutral, PublicKey=...
        ...

幸運を...

他の人が指摘しているように、シェル拡張機能は現在の Windows 開発では実用的ではありません。

最近同じような質問をしました これは、私がやりたかったことを正確に行うためのガイドへのリンクで回答されました

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top