私はこれを数年前にニュースグループに書きました。ざっと見てみると、これまでに書いた中で最も明確ではないことがわかりましたが、かなり完全です。その価値について、私はそれを以下に転載しました:
HKEY_CLASSES_ROOT
まず、アプリケーションを起動するコマンドを保持するサブキーを作成する必要があります。このキーには、わかりやすい名前を付ける必要があります。ファイル拡張子はこのキーにマッピングされます。たとえば、TXTファイルは次の名前のキーにマップされますtxtfile
、デフォルトで。この設定を使用する利点は、アプリで処理できる拡張機能が複数ある場合、それらすべてをこのキーにマップできることです。たとえば、多くの画像編集アプリは、「imagefile」などのサブキーを作成し、.bmp、.jpg、.gifなどをそのキーにマップします。キーを「JoeBlowFile」と呼びます。次に、新しいJoeBlowFileキーの「デフォルト」値を、ユーザーが持っているファイルの種類を説明するテキスト文字列に設定する必要があります。これは、Windowsエクスプローラの[タイプ]の下に表示されるものです。繰り返しになりますが、TXTファイルの例を使用するには、ここで適切な文字列は「テキストファイル」または「テキストドキュメント」です。(デフォルトでは後者です。)文字列は「JoeBlowData」の場合があります。
これで、新しいキーの下に、「DefaultIcon」という別のサブキーを作成できます。これは、その名前が示すように、このタイプのファイルで使用されるアイコンを設定します。プログラムで処理されるドキュメントを絵で表すカスタムアイコンを作成する必要があります。このアイコンをICOファイルとしてアプリのディレクトリに保存できますが、さらに良いことに、EXEまたはDLLのいずれかにリソースとして含めることができます。いずれの場合も、サブキーのデフォルト値を、ICO、EXE、またはDLLのフルパスとファイル名を表す文字列に設定する必要があります。ファイルに複数のアイコンがある場合(特に、EXEまたはDLLにリソースとして含める場合)、コンマと、どのアイコンを表すゼロベースの正のインデックス番号を追加する必要があります。使用したい、または負のリソースID、リソーススクリプトでアイコンに割り当てたIDのネガを使用します。したがって、たとえば「C:\ Program Files \ JoeBlow \ JoeBlow.exe、2」のようになります。
上記の段落に関するC#開発者向けのメモ。残念ながら、C#プロジェクトにはリソーススクリプトを含めることができません。プロジェクトに追加して「埋め込みリソース」を指定することで.NETアプリケーションに追加されたリソースは、以前の方法と互換性のない新しい.NET固有の形式で含まれています。VS.NETでC#を使用してアプリケーションに正しく埋め込むことができる唯一のアイコンは、プロジェクトのプロパティからアクセスできるアプリケーションアイコンです。追加のアイコンが必要な場合(たとえば、アプリ自体を表すのではなく、アプリによって処理されるドキュメントファイルを表すアイコン)、ICOファイル自体を含めるか、アイコンを埋め込んだC ++でDLLをコンパイルするか、作成する必要があります。リソーススクリプトをコンパイルし、プロジェクトのプロパティからプロジェクトに含めます。
キーを使用するかどうかに関係なく、DefaultIcon
キーの下に「shell」という名前のサブキーを作成する必要がありますJoeBlowFile
。下shell
キーを使用すると、コンテキストメニュー(右クリックメニュー)からユーザーがファイルタイプに対して実行できるようにするコマンドごとに個別のキーを作成します。これらの項目は「動詞」と呼ばれます。一貫性を保つために、そのうちの1つを「開く」必要があります。このキーが存在する場合は、デフォルトになります(つまり、ユーザーがタイプのファイルをダブルクリックすると、openコマンドが実行されます)。代わりに、「シェル」キーのデフォルト値を、デフォルトで実行する動詞と同じに設定できます。オプションで、各動詞キーのデフォルト値を、ユーザーがタイプのファイルを右クリックしたときにコンテキストメニューに表示するテキストに設定できます。このテキスト内でアンパサンド(&)を使用して、次の文字に下線が引かれることを示すことができます。つまり、ユーザーはその文字に対応するキーを押して、コンテキストメニューからそのコマンドを選択できます。たとえば、「開く」キーの場合、デフォルト値として「&JoeBlowのアプリで開く」を設定できます。次に、下線付きのJが付いたそのテキストが、そのタイプのファイルのコンテキストメニューに表示され、ユーザーは文字Jを押してJoeBlowのアプリを起動できます。
ただし、「開く」(および後続の)キーを使用して行う必要があるのは、「コマンド」と呼ばれるキーのサブキーとして別のキーを作成することだけです。コマンドキーのデフォルト値は、それを表す文字列、つまりそのアクションを実行するために必要なコマンドに設定する必要があります。たとえば、「open」キーの下にあるコマンドキーのデフォルトの文字列は、「 "C:\ Program Files \ JoeBlow \ JoeBlow.exe" "%1"」のようになります。アプリのpath\filenameと。の周りの引用符に注意してください%1
。パスまたはファイル名にスペースがある場合にのみ、アプリのパス\ファイル名の周りに必要ですが%1
、32ビットアプリの場合は絶対に必要です。これは、古いMS-DOSバッチ(.bat)ファイル %1
とまったく同じです。%1
%1
コマンドラインの最初のパラメーターに置き換えられます。この場合、このパラメーターは、アプリが開くことになっているファイルのファイル名になります。開くはずのファイルを含むパスまたはファイル名にスペースが含まれるかどうかは事前にわからないため、引用符で囲む必要があります%1
。
アプリに必要なその他のパラメーターも含める必要があります。たとえば、「print」キーの下にある「command」キーのデフォルト値は、「 "C:\ Program Files \ JoeBlow \ JoeBlow.exe" "%1"/print"または""C:\ Program Files \ JoeBlow \ JoeBlow.exe "/ print"%1""。アプリでコマンドラインパラメータをどのように処理するかはあなた次第です。
上記の「%1」などの交換可能なパラメータに関する注意。どうやら、 "%1"パラメータ/may/は開かれる短いファイル名に置き換えられるかもしれません。これは常に当てはまるわけではなく、Windowsがどの基準を使用して合格するか(短いか長いか)を判断していません。レジストリにリストされている実行可能パスが長いファイル名の場合、Windowsは%1を長いファイル名に置き換えて開始しますが、実行可能パスが短いファイル名であるか、1つと解釈できる場合、Windowsは次のように置き換えます%1
。短いファイル名。常に長いファイル名を確実に取得したい場合は、代わりに「%L」を使用してください。大文字のL(私が行ったように)または小文字のLを使用できますが、小文字の「l」があるため、大文字を使用することをお勧めします。
さらに、プログラムがシェルアイテムIDの処理方法を知っている場合は、「%i」パラメーターを使用して長いファイル名の代わりにそれを取得できます。繰り返しますが、大文字または小文字の「i」も同様に適していますが、大文字の「I」は小文字の「l」および数字の「1」と区別するのが難しいと思います。シェルアイテムIDがわからない場合は、問題ありません。おそらく使用する必要はありません。
ついにJoeBlowFile
鍵が完成しました。残りは比較的簡単です。HKEY_CLASSES_ROOTの下に別のサブキーを作成し(まだ存在しない場合)、ドキュメントタイプの拡張子と同じ名前を付ける必要があります。txtfileの例を使用するには、名前は「.txt」になります(ドットは含まれますが、引用符は含まれません)。あなた(ジョーブロー)は「.jbf」(ジョーブローファイル用)かもしれません。このキーのデフォルト値は、作成した最初のキーの名前に設定する必要があります。この例では、「JoeBlowFile」を使用しています。
それでおしまい。レジストリで完了です。「シェル」キーで設定したコマンドと同じ方法でアプリがコマンドラインを処理することを確認する必要があることを忘れないでください。Windowは、アプリの起動時にそのファイルを自動的に開きません...あなたはそれをしなければなりません。
グラフィック的には、次のようになります。
HKEY_CLASSES_ROOT
| +-。jbf=JoeBlowFile
|
+-JoeBlowFile = Joe Blow Data
|
+-DefaultIcon = C:\ Program Files \ JoeBlow \ JoeBlow.exe、2
|
+-シェル
|
+-open =&JoeBlowのアプリで開く
| |
| +-command = "C:\ Program Files \ JoeBlow \ JoeBlow.exe" "%1"
|
+-印刷
|
+-command = "C:\ Program Files \ JoeBlow \ JoeBlow.exe" "%1" / print
レジストリを変更する方法がまだわからない場合は、MSDNで、RegOpenKeyEx、RegCreateKeyEx、RegSetValueExなど、「Reg」で始まるすべての関数を探してください。また、「。reg」ファイルを作成し、ShellExecuteEx()を使用して「regedit.exe / s」を呼び出すことで、弱々しい方法で実行することもできます。(/s
Regeditが「[file.reg]の情報をレジストリに追加してもよろしいですか?」というメッセージボックスを表示しないようにします)REGファイルの形式は単純でわかりやすいものです。上記の「JoeBlow」の例を追加するためのREGファイルの例を次に示します。
REGEDIT4
[HKEY_CLASSES_ROOT \ .jbf]
@ = "JoeBlowFile"
[HKEY_CLASSES_ROOT \ JoeBlowFile]
@="ジョーブローデータ"
[HKEY_CLASSES_ROOT \ JoeBlowFile \ DefaultIcon]
@ = "C:\\ Program Files \\ JoeBlow \\ JoeBlow.exe、2"
[HKEY_CLASSES_ROOT \ JoeBlowFile \ Shell]
[HKEY_CLASSES_ROOT \ JoeBlowFile \ Shell \ open]
@ = "&JoeBlowのアプリで開く"
[HKEY_CLASSES_ROOT \ JoeBlowFile \ Shell \ open \ command]
@ = "\" C:\\ Program Files \\ JoeBlow \\ JoeBlow.exe \ "\"%1 \ ""
[HKEY_CLASSES_ROOT \ JoeBlowFile \ Shell \ print]
@ = "&Print"
[HKEY_CLASSES_ROOT \ JoeBlowFile \ Shell \ print \ command]
@ = "\" C:\\ Program Files \\ JoeBlow \\ JoeBlow.exe \ "%1 \" / print "
ファイルの最初の行に「REGEDIT4」が含まれていることを確認してください。含まれていないと、機能しません。また、最後の行でEnterキーを押すようにしてください。そうしないと、その行は読み込まれません。全体として、この方法でプログラムをレジストリに追加することは、次の場合にREGファイルを変更する必要があるため、思ったほど便利ではありません。アプリはC:\ Program Files\JoeBlow以外の場所にインストールされます。
上記の手順は、CまたはC++を使用してWin32APIに直接プログラミングするユーザーを対象としています。.NET上のC#の場合、少し簡単です。Registryクラスを参照してください。または、VS.NETのデプロイメントプロジェクトを使用して、その多くをグラフィカルに実行することもできます。
ネイティブアクセス可能なリソースを.NETアセンブリに追加するには、リソーススクリプトが必要です。リソーススクリプトは、コードファイルのようなプレーンテキストファイルです。実際、それはコードです。リソースコンパイラrc.exeによってコンパイルされる宣言型コード。サンプルリソーススクリプトは次のとおりです。
#include <windows.h>
#define IDI_APP 100
#define IDI_FILE 200
#define ID_VERSION 1
IDI_APP ICON "Resources\\Application.ico"
IDI_FILE ICON "Resources\\JowBlowFile.ico"
ID_VERSION VERSIONINFO
FILEVERSION 1, 0, 19, 186 // change this to your version
PRODUCTVERSION 1, 0, 19, 186 // change this to your version
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP {
BLOCK "StringFileInfo" {
BLOCK "040904B0" { // 0x409 = U.S. English, 0x04B0 = dec 1200 = Unicode
VALUE "CompanyName", "Joe Blow, Inc.\0"
VALUE "FileDescription", "Joe Blow's App\0"
VALUE "FileVersion", "1.0.19.186\0" // change this to your version
VALUE "InternalName", "JoeBlow\0"
VALUE "LegalCopyright", "Copyright © 2008-2009 Joe Blow Incorporated\0"
VALUE "OriginalFilename", "JoeBlow.exe\0"
VALUE "ProductName", "Joe Blow\0"
VALUE "ProductVersion", "1.0.19.189\0" // change this to your version
}
}
BLOCK "VarFileInfo" {
VALUE "Translation", 0x409 /*U.S. English*/, 1200 /*Unicode*/
}
}
これを行うことの最大の欠点は、バージョン情報をリソーススクリプトに手動で追加する必要があることです(バージョン情報を完全に忘れたい場合を除く)。私のアプリケーションでは、実行可能ファイルのバージョン情報を直接更新するプログラムを実行するカスタムビルドステップを追加して、リソーススクリプトのバージョン番号を手動で更新する必要がないようにしますが、そのプログラムは公開リリースであり、それ以外の場合はこの投稿の範囲を超えています。
次に、リソースコンパイラを呼び出して、このリソーススクリプトをバイナリリソースファイルにビルドする必要があります。このスクリプトをJoeBlow.rcとして保存してから、VisualStudioコマンドプロンプトを起動します。VisualStudioのスタートメニューフォルダーの[ツール]の下にあります。Visual Studioがインストールされていない場合は、SDKの一部としてrc.exeを入手できると思います。Microsoftもここで最新バージョンを提供しているようです。
VS cmdプロンプトが表示されたら(またはパスにrc.exeが含まれている場合)、次のように入力します。
rc JoeBlow.rc
そのような単純な。上記のリソーススクリプトは、私が含めたアイコンが存在することを考えると、エラーなしでコンパイルされるはずです。これにより、JoeBlow.resという同じディレクトリに新しいファイルが作成されます。ここで、 Visual Studioを使用していると仮定すると、プロジェクトのプロパティを編集してこのリソースファイルを含めるだけです。
これらの指示は、Visual Studio 2005または2008用です。これを行う方法を覚えていません。古いバージョンでできる場合でも、2010をまだ試していませんが、おそらく似ています。ソリューションエクスプローラーでプロジェクトを右クリックし、[プロパティ]を選択します(またはメインメニューバーの[プロジェクト]メニューから[プロパティ]を選択します)。最初に表示されるタブである[アプリケーション]タブの下部には、[リソース]グループボックスがあります。ここでは、「アイコンとマニフェスト」または「リソースファイル」の2つのオプションがあります。後者のオプションを選択します。これにより、新しいリソースファイルJoeBlow.resを入力(または参照)できるテキストボックスが有効になります。
最後に、プロジェクトをビルドするだけで、アプリに関連付けられたファイルを参照するときにシェルにアクセスできるネイティブPE形式のアイコンが埋め込まれます。ここで、の値を(ゼロベースのインデックス番号を使用して)またはHKEY_CLASSES_ROOT\JoeBlowFile\DefaultIcon
(リソース識別子の負の値を使用して、上記で#definedとして)に設定すると、アイコンが.jbfファイルのエクスプローラーに表示されます。C:\Program Files\JoeBlow\JoeBlow.exe,1
C:\Program Files\JoeBlow\JoeBlow.exe,-200
IDI_FILE
インストール直後に新しいアイコンを表示するには、シェルのアイコンキャッシュを更新する必要がある場合があります。私はここでそれを行う方法についての指示を見つけました。基本的な要点は、シェルアイコンのサイズ(at HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics
)を現在の値から別の値に変更してから元に戻し、WM_SETTINGCHANGE
変更するたびにメッセージをブロードキャストすることです。
幸運を。他に何か必要な場合はお知らせください。