पता करें कि किस प्रक्रिया ने एक वैश्विक हॉटकी पंजीकृत की? (विंडोज एपीआई)


114

जहां तक ​​मुझे पता चला है, विंडोज एक एपीआई फ़ंक्शन को यह बताने की पेशकश नहीं करता है कि किस एप्लिकेशन ने एक ग्लोबल हॉटकी (रजिस्टरहैडरीके माध्यम से) पंजीकृत किया है। मैं केवल यह पता लगा सकता हूं कि यदि रजिस्टरहॉटकी गलत है, तो हॉटकी पंजीकृत है, लेकिन हॉटकी का "मालिक" नहीं है।

प्रत्यक्ष एपीआई की अनुपस्थिति में, क्या कोई गोल चक्कर रास्ता हो सकता है? विंडोज प्रत्येक रजिस्टर्ड हॉटकी से जुड़े हैंडल को संभाल कर रखता है - यह थोड़ा पागलपन है कि इस जानकारी को प्राप्त करने का कोई तरीका नहीं होना चाहिए।

एक ऐसी चीज़ का उदाहरण जो संभवतः काम नहीं करेगी: एक पंजीकृत हॉटकी को भेजें (अनुकरण करें), फिर हॉटकी संदेश को इंटरसेप्ट करें विंडोज उस प्रक्रिया को भेज देगा जिसने इसे पंजीकृत किया था। सबसे पहले, मुझे नहीं लगता कि संदेश को रोकना गंतव्य खिड़की के हैंडल को प्रकट करेगा। दूसरा, यदि यह संभव था, तो भी यह एक बुरी बात होगी, क्योंकि हॉटकी भेजने से विभिन्न कार्यक्रमों के लिए सभी प्रकार की संभावित अवांछित गतिविधि शुरू हो जाएगी।

यह कुछ भी महत्वपूर्ण नहीं है, लेकिन मैंने इस तरह की कार्यक्षमता के लिए लगातार अनुरोधों को देखा है, और खुद को उन अनुप्रयोगों का शिकार किया है जो यूआई या डॉक्स में कहीं भी खुलासा किए बिना हॉटकी पंजीकृत करते हैं।

(डेल्फी में काम करना, और WinAPI में प्रशिक्षु से अधिक नहीं, कृपया दयालु बनें।)

जवाबों:


20

आपके प्रश्न ने मेरी रुचि को बढ़ा दिया है, इसलिए मैंने थोड़ी खुदाई की है और जबकि, दुर्भाग्य से मेरे पास आपके लिए उचित उत्तर नहीं है, मैंने सोचा कि मेरे पास जो है वह साझा करूँगा।

मुझे 1998 में लिखा कीबोर्ड हुक (डेल्फी में) बनाने का यह उदाहरण मिला , लेकिन डेल्फी 2007 में एक दोहों के साथ इसका संकलन किया जा सकता है।

यह एक कॉल के साथ एक DLL है SetWindowsHookExजो कॉलबैक फ़ंक्शन से गुजरता है, जो तब कुंजी स्ट्रोक को रोक सकता है: इस मामले में, यह उनके लिए मज़ाक के साथ छेड़छाड़ कर रहा है, बाएं कर्सर को दाईं ओर बदल रहा है, आदि। एक साधारण ऐप फिर DLL को कॉल करता है और वापस रिपोर्ट करता है। एक TTimer घटना के आधार पर इसके परिणाम। यदि आप रुचि रखते हैं तो मैं डेल्फी 2007 आधारित कोड पोस्ट कर सकता हूं।

यह अच्छी तरह से प्रलेखित और टिप्पणी की गई है और आप संभावित रूप से इसे काम करने के आधार के रूप में उपयोग कर सकते हैं जहां एक प्रमुख प्रेस जा रहा है। यदि आप कुंजी स्ट्रोक भेजने वाले एप्लिकेशन का हैंडल प्राप्त कर सकते हैं, तो आप इसे वापस उसी तरह ट्रैक कर सकते हैं। उस हैंडल से आप वह जानकारी प्राप्त कर पाएंगे जो आपको बहुत आसानी से चाहिए।

अन्य ऐप ने अपने शॉर्टकट से गुजरते हुए हॉटकी का निर्धारण करने की कोशिश की है क्योंकि उनमें एक शॉर्टकट कुंजी हो सकती है, जो हॉटकी के लिए सिर्फ एक और शब्द है। हालाँकि अधिकांश एप्लिकेशन इस संपत्ति को सेट करने की प्रवृत्ति नहीं रखते हैं, इसलिए यह अधिक वापस नहीं आ सकती है। यदि आप उस मार्ग में रुचि रखते हैं, तो डेल्फी के पास IShellLinkCOM इंटरफ़ेस तक पहुंच है, जिसका उपयोग आप एक शॉर्टकट को लोड करने और इसकी हॉटलाइन प्राप्त करने के लिए कर सकते हैं:

uses ShlObj, ComObj, ShellAPI, ActiveX, CommCtrl;

procedure GetShellLinkHotKey;
var
  LinkFile : WideString;
  SL: IShellLink;
  PF: IPersistFile;

  HotKey : Word;
  HotKeyMod: Byte;
  HotKeyText : string;
begin
  LinkFile := 'C:\Temp\Temp.lnk';

  OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, SL));

  // The IShellLink implementer must also support the IPersistFile
  // interface. Get an interface pointer to it.
  PF := SL as IPersistFile;

  // Load file into IPersistFile object
  OleCheck(PF.Load(PWideChar(LinkFile), STGM_READ));

  // Resolve the link by calling the Resolve interface function.
  OleCheck(SL.Resolve(0, SLR_ANY_MATCH or SLR_NO_UI));

  // Get hotkey info
  OleCheck(SL.GetHotKey(HotKey));

  // Extract the HotKey and Modifier properties.
  HotKeyText := '';
  HotKeyMod := Hi(HotKey);

  if (HotKeyMod and HOTKEYF_ALT) = HOTKEYF_ALT then
    HotKeyText := 'ALT+';
  if (HotKeyMod and HOTKEYF_CONTROL) = HOTKEYF_CONTROL then
    HotKeyText := HotKeyText + 'CTRL+';
  if (HotKeyMod and HOTKEYF_SHIFT) = HOTKEYF_SHIFT then
    HotKeyText := HotKeyText + 'SHIFT+';
  if (HotKeyMod and HOTKEYF_EXT) = HOTKEYF_EXT then
    HotKeyText := HotKeyText + 'Extended+';

  HotKeyText := HotKeyText + Char(Lo(HotKey));

  if (HotKeyText = '') or (HotKeyText = #0) then
    HotKeyText := 'None';

  ShowMessage('Shortcut Key - ' + HotKeyText);
end;

यदि आप सफारी बुक्स ऑनलाइन तक पहुंच गए हैं , तो स्टीव टेक्सीरा और जेवियर पचेको द्वारा बोरलैंड डेल्फी 6 डेवलपर गाइड में शॉर्टकट / शेल लिंक के साथ काम करने के बारे में एक अच्छा खंड है । ऊपर मेरा उदाहरण वहाँ और इस साइट से एक कसाई संस्करण है ।

उम्मीद है की वो मदद करदे!


59

विज़ुअल स्टूडियो टूल Spy ++ का उपयोग करने का एक संभावित तरीका है ।

इसे आजमाइए:

  1. उपकरण चलाएँ (मेरे लिए, यह C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\spyxx_amd64.exe)
  2. मेनू बार में, स्पाई चुनें -> लॉग संदेश ... (या हिट Ctrl+ M)
  3. अतिरिक्त विंडोज फ्रेम में सिस्टम में सभी विंडोज की जांच करें
  4. संदेश टैब पर स्विच करें
  5. क्लियर ऑल बटन पर क्लिक करें
  6. का चयन करें WM_HOTKEYलिस्टबॉक्स में, या जाँच कीबोर्ड में संदेश समूह (यदि आप और अधिक संभावित शोर के साथ आया हो)
  7. ओके बटन पर क्लिक करें
  8. प्रश्न में हॉटकी दबाएं ( उदाहरण के लिए Win+ R)
  9. संदेश (सभी विंडोज़) विंडो WM_HOTKEYमें लाइन का चयन करें , राइट क्लिक करें, और संदर्भ मेनू में गुण ... का चयन करें
  10. में संदेश गुण संवाद, क्लिक करें विंडो हैंडल लिंक (इस विंडो कि संदेश प्राप्त करने के लिए संभाल हो जाएगा)
  11. विंडो प्रॉपर्टीज डायलॉग पर सिंक्रोनाइज़ बटन पर क्लिक करें । यह मुख्य स्पाई ++ विंडो ट्रीव्यू में विंडो को दिखाएगा।
  12. पर खिड़की गुण संवाद, चयन प्रक्रिया टैब
  13. प्रक्रिया आईडी लिंक पर क्लिक करें । यह आपको प्रक्रिया दिखाएगा (मेरे Win+ Rमामले में:EXPLORER )

6
बहुत बढ़िया जवाब! बस ध्यान दें कि स्पाई ++ का 64-बिट संस्करण 64-बिट अनुप्रयोगों के लिए केवल संदेश को पकड़ता है , इसलिए यदि आपको हॉटकी दबाने के बाद संदेश लॉगWM_HOTKEY में संदेश नहीं दिखता है , तो आपको स्पाई ++ का 32-बिट संस्करण चलाने की आवश्यकता हो सकती है ।
डेविड फेरेन्स्की रोगोजान

बहुत बहुत धन्यवाद!!! जब तक मुझे यह नहीं मिला, मैंने मूल रूप से कुछ शॉर्टकट का उपयोग करना छोड़ दिया।
thewindev

3
चरण 8 में यह हॉटकी के लिए नहीं कहता है, किसी भी हॉटकी को दबाने के बाद संदेश विंडो खाली रहती है। Github.com/westoncampbell/SpyPlusPlus (विंडोज 10 में) से 32 और 64-बिट संस्करणों का उपयोग किया ।
कूलमाइंड

9

कुछ शोधों के बाद, ऐसा प्रतीत होता है कि आपको आंतरिक संरचना तक पहुंचने की आवश्यकता होगी जो एमएस हॉटकीज़ को स्टोर करने के लिए उपयोग करता है। ReactOS में एक साफ कमरा कार्यान्वयन है जो GetHotKeyकॉल को आंतरिक सूची में पुनरावृत्ति करता है और कॉल के मापदंडों से मेल खाने वाले हॉटकी को निकालता है।

इस बात पर निर्भर करता है कि MS लागू करने के लिए रिएक्टोस का कार्यान्वयन कितना निकट है, आप संरचना को खोजने के लिए स्मृति में चारों ओर प्रहार करने में सक्षम हो सकते हैं, लेकिन यह मेरे सिर पर है ...

BOOL FASTCALL
GetHotKey (UINT fsModifiers,
           UINT vk,
           struct _ETHREAD **Thread,
           HWND *hWnd,
           int *id)
{
   PHOT_KEY_ITEM HotKeyItem;

   LIST_FOR_EACH(HotKeyItem, &gHotkeyList, HOT_KEY_ITEM, ListEntry)
   {
      if (HotKeyItem->fsModifiers == fsModifiers &&
            HotKeyItem->vk == vk)
      {
         if (Thread != NULL)
            *Thread = HotKeyItem->Thread;

         if (hWnd != NULL)
            *hWnd = HotKeyItem->hWnd;

         if (id != NULL)
            *id = HotKeyItem->id;

         return TRUE;
      }
   }

   return FALSE;
}

मुझे लगता है कि इस धागे को sysinternals पर इस प्रश्न से संबंधित किसी व्यक्ति द्वारा पूछा गया था, लेकिन मैंने सोचा कि मैं इसे दोनों को एक साथ रखने के लिए वैसे भी लिंक करूंगा। धागा बहुत पेचीदा दिखता है, लेकिन मुझे संदेह है कि कुछ गहरे गोता लगाने के लिए एमएस इंटर्नल तक पहुंच के बिना यह पता लगाने की आवश्यकता होगी।


3

मेरे सिर के ऊपर से, आप EnumWindows के साथ सभी विंडो की गणना करने की कोशिश कर सकते हैं, फिर कॉलबैक में, WM_GETHOTKEY को प्रत्येक विंडो पर भेजें।

संपादित करें: स्पष्ट रूप से मैं इसके बारे में गलत था। MSDN में अधिक जानकारी है:

WM_HOTKEY WM_GETHOTKEY और WM_SETHOTKEY हॉट कुंजियों से संबंधित नहीं है। WM_HOTKEY संदेश सामान्य हॉट कुंजियों के लिए भेजा जाता है, जबकि WM_SETHOTKEY और WM_GETHOTKEY संदेश विंडो सक्रियण हॉट कुंजियों से संबंधित होते हैं।

नोट: यहाँ एक प्रोग्राम है जिसे आप जिस कार्यशीलता के लिए देख रहे हैं वह है। आप इसे विघटित करने का प्रयास कर सकते हैं।


3
कार्यक्रम का लिंक अब पूरी तरह से टूट गया है। वह कौन सा कार्यक्रम था? बहुत बार मैं यह जानना चाहूंगा कि किस कार्यक्रम ने मेरी हॉटकी पंजीकृत की क्योंकि अचानक वे अब काम नहीं करते हैं या नई चीजों को परेशान नहीं करते हैं।
जेम्स ओल्टमेंस

(अक्सर, वेबैक मशीन वेबपेज के गायब होने की स्थिति में मदद कर सकती है, लेकिन यहां भी केवल 404 नहीं मिला है: http://web.archive.org/web/*/tds.diamondcs.com.au/dse/ पता लगाना / हॉटकीसेफ़ ))
हारून थोमा

2

यह आपको बहुत कुछ बताता है: http://hkcmdr.anymania.com/help.html


1
क्या यह? एक DLL चालक के रूप में प्रच्छन्न? DLL फ़ंक्शन दो हुक, एक और एक सेट के hooउपयोग के रूप में निर्यात किया जाता है ... बाकी को MSDN पर बहुत अधिक प्रलेखित किया जाना चाहिए। SetWindowHookExWH_KEYBOARD_LLWH_GETMESSAGE
0xC0000022L

विंडोज 8 या 10. पर इस ऐप का उपयोग न करें
जेफ लैंग

1

एक अन्य सूत्र में एक वैश्विक NT स्तर कीबोर्ड हुक का उल्लेख है:

विंडोज़ को लॉक करने के लिए हॉटकी (विन + एल) को फिर से असाइन / ओवरराइड करें

हो सकता है कि आप उस प्रक्रिया को संभाल सकें जो हुक को इस तरह से बुलाती है, जिसे आप फिर प्रक्रिया के नाम पर हल कर सकते हैं

(अस्वीकरण: मेरे पास मेरे बुकमार्क में था, वास्तव में कोशिश / परीक्षण नहीं किया गया है)


0

मुझे पता है कि आप अपनी प्रक्रिया में किसी भी विंडो में संदेशों की धारा को रोक सकते हैं - जिसे हम VB6 में सबक्लासिंग कहते थे। (हालांकि मुझे फ़ंक्शन याद नहीं है, शायद SetWindowLong?) मैं अनिश्चित हूं यदि आप अपनी प्रक्रिया के बाहर खिड़कियों के लिए ऐसा कर सकते हैं। लेकिन इस पोस्ट की खातिर आपको लगता है कि ऐसा करने का एक तरीका है। तब आप बस सभी शीर्ष स्तर की खिड़कियों के लिए संदेशों को रोक सकते हैं, WM_HOTKEY संदेश के लिए निगरानी कर सकते हैं। आप बल्ले से सभी कुंजियों को ठीक से नहीं जान पाएंगे, लेकिन जैसा कि वे दबाए गए थे आप आसानी से पता लगा सकते हैं कि कौन सा एप्लिकेशन उनका उपयोग कर रहा था। यदि आपने अपने परिणामों को डिस्क पर पुनः लोड किया और हर बार आपका मॉनिटर एप्लिकेशन चलाया तो आप समय के साथ अपने आवेदन के प्रदर्शन को बढ़ा सकते थे।


-1

यह Windows API के बारे में पूछे गए प्रश्न के भाग का सटीक उत्तर नहीं देता है, लेकिन यह उस प्रश्न के भाग का उत्तर देता है जो वैश्विक हॉटकीज़ की सूची और उन अनुप्रयोगों के बारे में है जो उन्हें "स्वयं" करते हैं।

Http://hkcmdr.anymania.com/ पर नि: शुल्क हॉटकी एक्सप्लोरर सभी वैश्विक हॉटकीज़ और उनके स्वयं के अनुप्रयोगों की एक सूची दिखाता है। इसने मुझे यह पता लगाने में मदद की है कि एप्लिकेशन-विशिष्ट शॉर्टकट कुंजी ने काम करना क्यों बंद कर दिया है और इसे कैसे ठीक किया जा सकता है (ऐप में पंजीकृत वैश्विक हॉटकी को पुन: कॉन्फ़िगर करके जो उसने पंजीकृत किया था), कुछ सेकंड के भीतर।


4
इसे स्थापित किया और यह एक वायरस की तरह काम करता था, कम से कम मॉल-इरादा के साथ एक कार्यक्रम, एक बुरे मजाक की तरह। सभी प्रकार की खिड़कियाँ खोलना, आवाज की आवाज को सक्रिय करना, आदि
फ्लिन

3
@Flion: पर चर्चा देखें superuser.com/a/191090/3617 । मूल रूप से, कुछ हॉटकी उपयोग हर संभव कुंजी संयोजन की जांच करके काम करते हैं। विंडोज 8+ पर, (और विंडोज 7 पर कुछ हद तक), यह जांच तकनीक हर महत्वपूर्ण संयोजन को ट्रिगर करती है, बजाय इसे क्वेरी करने के।
ब्रायन

@Flion FWIW, मैंने इसे Win7 पर सफलता के साथ उपयोग किया। लेकिन अगर मैं ब्रायन को सही ढंग से समझता हूं, तो यह बाद के संस्करणों के साथ भी काम नहीं कर सकता है, और यह कितनी अच्छी तरह काम करता है यह कस्टम हॉटकीज़ पर भी निर्भर हो सकता है।
गेरहार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.