2025, Oct 16 01:32

InternetShortcut (.url) के लिए HKCU पर per-user context menu verb कैसे जोड़ें

Windows में .url InternetShortcut के लिए per-user context menu verb जोड़ने का तरीका: HKCU\Software\Classes ओवरराइड और UserChoice/ProgId का प्रभाव समझाएँ।

Windows में प्रति-उपयोगकर्ता कॉन्टेक्स्ट मेनू आइटम जोड़ना आम तौर पर आसान होता है: HKCU के तहत एक verb दर्ज करें, और शेल उसे उठा लेता है। यह साधारण फ़ाइलों, फ़ोल्डरों और .lnk शॉर्टकट्स के लिए भरोसेमंद तरीके से काम करता है। लेकिन Internet Shortcuts (.url) की संरचना अलग है — और यहीं अक्सर दिक्कत आती है।

कोड में समस्या

वर्तमान उपयोगकर्ता के तहत कॉन्टेक्स्ट मेनू verb पंजीकृत करने का सामान्य पैटर्न कुछ ऐसा दिखता है:

import winreg as wreg
key_path = r"SOFTWARE\Classes\*\shell\NewItem"
with wreg.CreateKey(wreg.HKEY_CURRENT_USER, key_path) as root_handle:
    wreg.SetValueEx(root_handle, 'MUIVerb', 0, wreg.REG_SZ, 'New Item')
    with wreg.CreateKey(root_handle, 'command') as action_key:
        wreg.SetValue(action_key, '', wreg.REG_SZ, r'"C:\...\app.exe" "%1"')

इस संरचना में SOFTWARE\Classes\*\shell\NewItem “सभी फ़ाइलों” को लक्षित करता है, SOFTWARE\Classes\Directory\shell\NewItem फ़ोल्डरों को लक्षित करता है, और SOFTWARE\Classes\lnkfile\shell\NewItem .lnk शॉर्टकट्स को। यही तरीका SOFTWARE\Classes\InternetShortcut\shell या SOFTWARE\Classes\.url\shell\NewItem के माध्यम से Internet Shortcuts पर लागू करने की कोशिश अपेक्षित नतीजा नहीं देती।

असल में होता क्या है

Windows सिस्टम-स्तरीय फ़ाइल-प्रकार रजिस्ट्रेशन का कैटलॉग HKEY_CLASSES_ROOT में रखता है। HKCU\Software\Classes उसी कैटलॉग पर उपयोगकर्ता-विशिष्ट ओवरराइड लगाता है। पढ़ना संयोजित रूप में होता है; HKCR पर लिखना प्रशासनिक अधिकारों के बिना प्रतिबंधित है, जबकि HKCU\Software\Classes प्रति-उपयोगकर्ता लिखने योग्य है।

खासतौर पर .url के लिए, सिस्टम-स्तरीय रजिस्ट्रेशन मौजूद होता है, जबकि उपयोगकर्ता-स्तर का समकक्ष अक्सर नहीं मिलता। इसीलिए केवल HKCU के तहत एंट्री जोड़ना प्रभावहीन लग सकता है। यहाँ प्रासंगिक क्लास नाम InternetShortcut है। एक और व्यावहारिक पहलू यह है कि प्रभावी एसोसिएशन HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.url\UserChoice के तहत संग्रहीत ProgId से नियंत्रित हो सकती है। यह IE.AssocFile.URL, ChromeHTML, FirefoxURL, OperaHTML वगैरह जैसा कुछ हो सकता है, जो तय करता है कि .url को कैसे संभाला जाए।

एक व्यवहारगत बारीकी भी है: अन्य फ़ाइल प्रकारों के लिए अतिरिक्त हैंडलर अक्सर “Open with” UI में दिखाई देते हैं। Internet Shortcuts में “Open with” डिफ़ॉल्ट रूप से नहीं दिखता, और उसे सक्षम करने के लिए प्रशासनिक अधिकार चाहिए, जैसा यहाँ दर्ज है: https://www.elevenforum.com/t/add-or-remove-open-with-context-menu-to-url-files-in-windows-11.11958/.

समाधान की दिशा

कारगर तरीका यह है कि InternetShortcut नामक क्लास के लिए HKCU\Software\Classes के तहत प्रति-उपयोगकर्ता ओवरराइड रखें। यही वह उपयोगकर्ता-परत है जो HKEY_CLASSES_ROOT को पूरक या ओवरराइड करती है। क्या आपको उपयोगकर्ता स्तर पर बड़े अक्षरों वाली .URL एक्सटेंशन को भी ओवरराइड करना है, या सिस्टम-स्तरीय InternetShortcut सबकीज़ को कॉपी करके फिर उन्हें बढ़ाना है, या बस नई क्लास की-कुंजी बनाकर उसके तहत verb जोड़ना है — यह बदल सकता है। आधार क्लास InternetShortcut है; HKEY_CLASSES_ROOT\InternetShortcut के तहत वास्तविक सबट्री Windows संस्करण और कॉन्फ़िगर किए गए ब्राउज़र के अनुसार भिन्न हो सकते हैं, इसलिए regedit.exe से अपने सिस्टम की वर्तमान स्थिति देखना सुरक्षित पहला कदम है।

उपयोगकर्ता-स्तर पर लिखने का उदाहरण

यह स्निपेट प्रति-उपयोगकर्ता क्लास कुंजी InternetShortcut के तहत एक verb जोड़ता है। संरचना और मान वही हैं जो अन्य प्रकारों के लिए काम करते हैं, बस क्लास .url से संबंधित है:

import winreg as wreg
user_class_path = r"SOFTWARE\Classes\InternetShortcut\shell\NewItem"
with wreg.CreateKey(wreg.HKEY_CURRENT_USER, user_class_path) as cls_key:
    wreg.SetValueEx(cls_key, 'MUIVerb', 0, wreg.REG_SZ, 'New Item')
    with wreg.CreateKey(cls_key, 'command') as cmd_node:
        wreg.SetValue(cmd_node, '', wreg.REG_SZ, r'"C:\...\app.exe" "%1"')

यदि आपकी मशीन पर .url का प्रभावी हैंडलर ...\FileExts\.url\UserChoice के तहत किसी ProgId से संचालित है, तो यह इस बात को प्रभावित कर सकता है कि आपका नया verb कैसे सतह पर आता है। InternetShortcut क्लास का सिस्टम-स्तरीय संदर्भ HKEY_CLASSES_ROOT\InternetShortcut में देखा जा सकता है, और वहाँ के मान अलग-अलग सिस्टम पर भिन्न हो सकते हैं।

यह क्यों मायने रखता है

.url फ़ाइलों के लिए कॉन्टेक्स्ट मेनू इंटीग्रेशन सिस्टम-स्तर की क्लासेज, उपयोगकर्ता-स्तर के ओवरराइड्स और वर्तमान ब्राउज़र एसोसिएशन — इन सबके संगम पर बैठता है। प्रति-उपयोगकर्ता इंस्टॉल के लिए केवल HKCU में लिखना अच्छी प्रथा है, लेकिन Internet Shortcuts में गलत एंट्री-पॉइंट को लक्षित करना आसान है, या ऐसे UI की अपेक्षा करना जो डिफ़ॉल्ट रूप से मौजूद नहीं होता। यह समझना कि HKCU\Software\Classes, HKCR के लिए एक ओवरले है, स्पष्ट करता है कि एक hive में लिखने से तुरंत असर क्यों नहीं दिखता, और HKCR के तहत अनुमतियाँ बदलावों को क्यों रोक सकती हैं।

मुख्य निष्कर्ष

संबंधित क्लास को InternetShortcut के रूप में पहचानें और अपना कस्टम verb HKCU\Software\Classes के तहत रखें ताकि प्रशासनिक अधिकारों की ज़रूरत न पड़े। HKEY_CLASSES_ROOT में सिस्टम-स्तरीय क्लास क्या रखती है, यह जाँच लें और याद रखें कि ब्राउज़र कॉन्फ़िगरेशन और OS संस्करण उन विवरणों को बदल सकते हैं। यदि उपयोगकर्ता के ...\UserChoice में किसी ProgId से .url की एसोसिएशन निर्देशित है, तो वह भी परिणाम को आकार देता है। जहाँ “Open with” आम तौर पर हैंडलर्स दिखाता है, .url अलग व्यवहार करता है और उस UI को सक्षम करना एडमिन-स्तर के बदलाव मांगता है।

इन सीमाओं को ध्यान में रखते हुए, आप सही स्थान पर प्रति-उपयोगकर्ता verb जोड़ सकते हैं और अपेक्षित व्यवहार की पुष्टि के लिए लक्ष्य वातावरण पर परीक्षण कर सकते हैं।

यह लेख StackOverflow पर एक प्रश्न (लेखक: H.P.) और cyberbrain के उत्तर पर आधारित है।