首次在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 /?
。
如果您打算爲您的應用程序提供安裝程序,只需使用您選擇使用的任何安裝程序框架中提供的文件關聯功能即使Visual Studio安裝項目也知道如何執行此操作。
要直接從您的代碼中更改文件類型關聯,我相信您必須查看HKEY_CLASSES_ROOT
並找到/創建要綁定到的擴展名(例如「.pdf」)的密鑰。在此密鑰內,默認值是一個字符串,其中包含對HKEY_CLASSES_ROOT
內另一個密鑰的引用。請按照該指針,展開/創建shell
子項並在此處添加/更改您的命令。通過regedit
查看這個區域,以瞭解它的外觀。
我在我的寵物項目中有一些C#代碼,它查找PDF文件的綁定並在其上下文菜單中添加一個額外的選項。請隨時致電have a look。
在Microsoft.Win32
中使用Registry
類。
具體來說,你想要的Registry
的ClassesRoot
屬性來訪問HKEY_CLASSES_ROOT
鍵(參見Understanding MS Windows File Associations和HKEY_CLASSES_ROOT: Core Services)。
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,你可以更新環境:(感謝Enthough噸此)
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)
我有這樣的代碼: 「處理EmulatorProcess; EmulatorProcess = Process.Start(@「C:\ Documents and Settings \ serg \ Desktop \ Emubox v0.01 \ SuperNintendo \ Roms \ Super Mario RPG(U).smc」); EmulatorProcess.WaitForInputIdle();' 我用硬編碼的路徑來測試一下。我怎麼能將你的最後一行代碼應用於我的需求?謝謝! :D – 2009-07-04 20:45:26