12

初めて StackOverflow に投稿します。:D レジストリにいくつかのものを追加するには、ソフトウェアが必要です。

私のプログラムは使用します

Process.Start(@"blblabla.smc");

ファイルを起動しますが、問題は、ほとんどの場合、ユーザーが特定のファイル拡張子のデフォルト アプリケーションとしてプログラムを設定していないことです。

ファイルの関連付けを WindowsRegistry に追加するにはどうすればよいですか?

4

4 に答える 4

28

すでに提供されている回答に加えて、コマンドラインプログラム「ASSOC」および「FTYPE」を呼び出すことでこれを実行できます。FTYPEは、ファイルタイプをプログラムに関連付けます。ASSOCは、ファイル拡張子をFTYPEで指定されたファイルタイプに関連付けます。例えば:

FTYPE SMCFile="C:\some_path\SMCProgram.exe" -some_option %1 %*
ASSOC .smc=SMCFile

これにより、レジストリに必要なエントリが作成されます。詳細については、ASSOC /?またはFTYPE /?コマンドプロンプトで入力してください。

于 2009-07-04T20:47:35.173 に答える
8

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");
于 2009-07-04T20:27:38.817 に答える
3

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)
于 2010-06-16T11:08:39.140 に答える
1

アプリケーションにインストーラーを提供することを計画している場合は、使用することを選択したインストーラー フレームワークで利用可能なファイル関連付け機能を使用するだけです。Visual Studio セットアップ プロジェクトでさえ、これを行う方法を知っています。

ファイルタイプの関連付けをコードから直接変更するにはHKEY_CLASSES_ROOT、バインドしたい拡張子(つまり「.pdf」)を持つキーを調べて見つけて作成する必要があると思います。このキー内のデフォルト値は、 内の別のキーへの参照を含む文字列ですHKEY_CLASSES_ROOT。そのポインターをたどり、shellサブキーを展開/作成し、ここでコマンドを追加/変更します。でこのあたりをregedit見回して、その様子を感じ取ってください。

私のお気に入りのプロジェクトにいくつかの C# コードがあります。これは、PDF ファイルのバインドを検索し、コンテキスト メニューに追加のオプションを追加します。お気軽にご覧ください

于 2009-07-04T20:19:13.483 に答える