2009-07-04 13 views
12

स्टैक ओवरव्लो में पहली बार पोस्टिंग। : डी मुझे रजिस्ट्री में कुछ चीजें जोड़ने के लिए अपने सॉफ़्टवेयर की आवश्यकता है।रजिस्ट्री में filetype एसोसिएशन को कैसे बदलें?

मेरे कार्यक्रम

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

का उपयोग एक फ़ाइल शुरू करने के लिए होगा, लेकिन समस्या यह है कि सबसे अधिक संभावना उपयोगकर्ता एक कार्यक्रम विशेष रूप से फ़ाइल एक्सटेंशन के लिए डिफ़ॉल्ट आवेदन के रूप में स्थापित नहीं होगा है।

मैं WindowsRegistry में फ़ाइल एसोसिएशन कैसे जोड़ सकता हूं?

उत्तर

28

जवाब पहले से ही प्रदान की के अलावा, आप कमांड लाइन प्रोग्राम "ASSOC" और "FTYPE" को फोन करके ऐसा कर सकते हैं। FTYPE एक फ़ाइल प्रकार को एक प्रोग्राम के साथ जोड़ता है। एएसएसओसी एक फ़ाइल एक्सटेंशन को फ़ाइल प्रकार के साथ एफटीईपीई के माध्यम से निर्दिष्ट करता है। उदाहरण के लिए:

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

यह रजिस्ट्री में आवश्यक प्रविष्टियां करेगा। अधिक जानकारी के लिए, कमांड प्रॉम्प्ट पर ASSOC /? या FTYPE /? टाइप करें।

1

यदि आप अपने आवेदन के लिए इंस्टॉलर प्रदान करने की योजना बना रहे हैं, तो आप जो भी इंस्टॉलर फ्रेमवर्क चुनने के लिए चुनते हैं, उसमें उपलब्ध फ़ाइल एसोसिएशन सुविधा का उपयोग करें - यहां तक ​​कि विजुअल स्टूडियो सेटअप प्रोजेक्ट भी जानता है कि यह कैसे करें।

फ़ाइल कोड एसोसिएशन को सीधे अपने कोड से बदलने के लिए, मुझे विश्वास है कि आपको HKEY_CLASSES_ROOT में देखना होगा और उस एक्सटेंशन के साथ एक कुंजी ढूंढें/जिसे आप बाध्य करना चाहते हैं (यानी ".pdf")। इस कुंजी के भीतर, डिफ़ॉल्ट मान एक स्ट्रिंग है जिसमें HKEY_CLASSES_ROOT के भीतर किसी अन्य कुंजी का संदर्भ होता है। उस पॉइंटर का पालन करें, shell उपकुंजी का विस्तार/बनाएं और यहां अपने आदेश जोड़ें/बदलें। यह दिखने के लिए regedit के साथ इस क्षेत्र के चारों ओर देखो।

मेरे पास एक पालतू परियोजना में कुछ सी # कोड है, जो पीडीएफ फाइलों के लिए बाध्यकारी दिखता है और उनके संदर्भ मेनू में एक अतिरिक्त विकल्प जोड़ता है। have a look पर निःशुल्क महसूस करें।

8

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); 

कार्यक्रम है कि आप विस्तार .smc साथ फाइलों के साथ संबद्ध करने के लिए इच्छा के लिए कमांड लाइन पथ और तर्क विनिर्देशन के साथ "SMCProcessor \"%1\"" बदलें।

लेकिन, बजाय रजिस्ट्री के साथ खिलवाड़ की, क्यों नहीं सिर्फ इतना कहना

Process.Start("SMCProcessor blblabla.smc"); 
+0

मैं इस कोड है: 'प्रक्रिया EmulatorProcess; EmulatorProcess = Process.Start (@ "सी: \ दस्तावेज़ और सेटिंग्स \ serg \ डेस्कटॉप \ Emubox v0.01 \ SuperNintendo \ Roms \ सुपर मारियो आरपीजी (यू) .smc"); EmulatorProcess.WaitForInputIdle(); ' मैंने चीजों का परीक्षण करने के लिए बस एक हार्डकोडेड पथ का उपयोग किया। मैं अपनी जरूरतों के लिए कोड की आखिरी पंक्ति कैसे लागू कर सकता हूं? धन्यवाद! : डी –

+0

[इस उत्तर] से (http://stackoverflow.com/a/13535039/1497596): * "रजिस्ट्रीकी 'वर्ग' आईडीस्पोजेबल 'लागू करता है और इसलिए आपको अपनी चाबियाँ' उपयोग 'कथन में लपेटनी चाहिए।" * या, वैकल्पिक रूप से, आपको 'रजिस्ट्रीकी' पर [बंद करें या निपटान करें] (http://stackoverflow.com/a/37059244/1497596) पर कॉल करना चाहिए जब आप इसके साथ काम करेंगे। इसका अर्थ यह है कि इस उदाहरण में दिखाए गए विधि श्रृंखला में 'CreateSubKey' सहित एक बुरा विचार है। – DavidRR

3

अजगर का उपयोग करना:

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) के रूप में विस्तार रजिस्टर:

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 

एक्सटेंशन प्रकार के साथ एक आइकन संबद्ध कर रहा है

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 को फिर से लॉग इन किए बिना पहचाने जाने के लिए आप पर्यावरण को अपडेट कर सकते हैं: (हालांकि धन्यवाद इस के लिए टी)

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) 
संबंधित मुद्दे