初めて StackOverflow に投稿します。:D レジストリにいくつかのものを追加するには、ソフトウェアが必要です。
私のプログラムは使用します
Process.Start(@"blblabla.smc");
ファイルを起動しますが、問題は、ほとんどの場合、ユーザーが特定のファイル拡張子のデフォルト アプリケーションとしてプログラムを設定していないことです。
ファイルの関連付けを WindowsRegistry に追加するにはどうすればよいですか?
初めて StackOverflow に投稿します。:D レジストリにいくつかのものを追加するには、ソフトウェアが必要です。
私のプログラムは使用します
Process.Start(@"blblabla.smc");
ファイルを起動しますが、問題は、ほとんどの場合、ユーザーが特定のファイル拡張子のデフォルト アプリケーションとしてプログラムを設定していないことです。
ファイルの関連付けを WindowsRegistry に追加するにはどうすればよいですか?
すでに提供されている回答に加えて、コマンドラインプログラム「ASSOC」および「FTYPE」を呼び出すことでこれを実行できます。FTYPEは、ファイルタイプをプログラムに関連付けます。ASSOCは、ファイル拡張子をFTYPEで指定されたファイルタイプに関連付けます。例えば:
FTYPE SMCFile="C:\some_path\SMCProgram.exe" -some_option %1 %*
ASSOC .smc=SMCFile
これにより、レジストリに必要なエントリが作成されます。詳細については、ASSOC /?
またはFTYPE /?
コマンドプロンプトで入力してください。
Registry
でクラスを使用しMicrosoft.Win32
ます。
具体的には、 のClassesRoot
プロパティでキーRegistry
にアクセスする必要があります ( MS Windows ファイルの関連付けとHKEY_CLASSES_ROOT: コア サービスについて を参照)。HKEY_CLASSES_ROOT
using Microsoft.Win32;
Registry
.ClassesRoot
.CreateSubKey(".smc")
.SetValue("", "SMC", RegistryValueKind.String);
Registry
.ClassesRoot
.CreateSubKey("SMC\shell\open\command")
.SetValue("", "SMCProcessor \"%1\"", RegistryValueKind.String);
"SMCProcessor \"%1\""
を拡張子 のファイルに関連付けるプログラムのコマンドライン パスと引数の指定に置き換えます.smc
。
しかし、レジストリをいじる代わりに、
Process.Start("SMCProcessor blblabla.smc");
Pythonの使用:
EXT, EXT_TYPE = ".xyz", "XYZ file"
EXE_PATH = r"path\to\my\exe"
# %L is the long (full path) version of path
extCmd = '"%s" "%%L" %%*' % EXE_PATH
# Using assoc and ftype easier than editing registry!
assert os.system('assoc %s=%s' % (EXT, EXT_TYPE))==0
assert os.system('ftype %s=%s' % (EXT_TYPE, extCmd))==0
アイコンを拡張タイプに関連付ける:
import _winreg
try:
ext = _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, EXT_TYPE)
_winreg.SetValue(ext, "DefaultIcon", _winreg.REG_SZ, ICON_PATH)
_winreg.CloseKey(ext)
except WindowsError:
print "Error associating icon"
拡張機能を実行可能タイプ(つまり、PATHEXT)として登録します。
try:
key = r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'
reg = _winreg.ConnectRegistry( None, _winreg.HKEY_LOCAL_MACHINE )
# get current value
ext = _winreg.OpenKey(reg, key)
pathext = _winreg.QueryValueEx(ext, 'PATHEXT')[0]
if not EXT in pathext:
_winreg.CloseKey(ext)
# modify the current value
ext = _winreg.OpenKey(reg, key, 0, _winreg.KEY_ALL_ACCESS)
pathext += ';' + EXT
_winreg.SetValueEx(ext, 'PATHEXT', 0, _winreg.REG_SZ, pathext)
_winreg.CloseKey(ext)
_winreg.CloseKey(reg)
except WindowsError:
print "Error adding to PATHEXT"
さらに、再度ログインせずにPATHEXTを認識させるには、環境を更新できます:(これについてはEnthoughtに感謝します)
def refreshEnvironment():
HWND_BROADCAST = 0xFFFF
WM_SETTINGCHANGE = 0x001A
SMTO_ABORTIFHUNG = 0x0002
sParam = "Environment"
import win32gui
res1, res2 = win32gui.SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, sParam, SMTO_ABORTIFHUNG, 100)
アプリケーションにインストーラーを提供することを計画している場合は、使用することを選択したインストーラー フレームワークで利用可能なファイル関連付け機能を使用するだけです。Visual Studio セットアップ プロジェクトでさえ、これを行う方法を知っています。
ファイルタイプの関連付けをコードから直接変更するにはHKEY_CLASSES_ROOT
、バインドしたい拡張子(つまり「.pdf」)を持つキーを調べて見つけて作成する必要があると思います。このキー内のデフォルト値は、 内の別のキーへの参照を含む文字列ですHKEY_CLASSES_ROOT
。そのポインターをたどり、shell
サブキーを展開/作成し、ここでコマンドを追加/変更します。でこのあたりをregedit
見回して、その様子を感じ取ってください。
私のお気に入りのプロジェクトにいくつかの C# コードがあります。これは、PDF ファイルのバインドを検索し、コンテキスト メニューに追加のオプションを追加します。お気軽にご覧ください。