2016-01-31 3 views
5

डेल्फी आईडीई में एक नया शॉर्टकट जोड़ना बहुत मुश्किल नहीं है क्योंकि ओपन टूल्स एपीआई इसके लिए एक सेवा प्रदान करता है। मैं जाहिरा तौर पर और अधिक जटिल कुछ कोशिश कर रहा हूँ: एक WordStar अतिरिक्त शॉर्टकट की तरह जोड़ें:मैं उपकरण एपीआई का उपयोग कर डेल्फी आईडीई में कुंजी बाध्यकारी Shift + Ctrl + H X कैसे जोड़ूं?

मैं तो होना ही कुछ चाहते हैं जब उपयोगकर्ता प्रेस

Shift + Ctrl + H एकल कुंजी एक्स के बाद

जहाँ X चाहिए Shift कुंजी की स्थिति के बावजूद काम करते हैं।

procedure TGxKeyboardBinding.BindKeyboard(const BindingServices: IOTAKeyBindingServices); 
const 
    DefaultKeyBindingsFlag = kfImplicitShift + kfImplicitModifier + kfImplicitKeypad; 
var 
    GExpertsShortcut: Byte; 
    ShiftState: TShiftState; 
    FirstShortCut: TShortCut; 
    SecondShortCut: TShortCut; 
begin 
    GExpertsShortcut := Ord('H'); 
    ShiftState := [ssShift, ssCtrl]; 
    FirstShortCut := ShortCut(GExpertsShortcut, ShiftState); 
    SecondShortCut := ShortCut(Ord('X'), []); 
    BindingServices.AddKeyBinding([FirstShortCut, SecondShortCut], 
    TwoKeyBindingHandler, nil, 
    DefaultKeyBindingsFlag, '', ''); 
end; 

तो, अगर मैं ShiftState सेट:: = [ssCtrl] दबाने

Ctrl + H एक्स

मेरी TwoKeyBindingHandler प्रणाली को बुलाती है

यह मेरा कोड है।

लेकिन ShiftState साथ: = [ssShift, ssCtrl] दबाने

Shift + Ctrl + H एक्स

कुछ नहीं करता है।

अजीब तरह से पर्याप्त है, जब ShiftState को निर्दिष्ट: = [ssShift, ssCtrl] दबाने

Shift + Ctrl + H शिफ्ट (जो केवल पहले कुंजी प्रभावित करना चाहिए) + X

, मेरे TwoKeyBindingHandler प्रणाली को बुलाती है, भले ही दूसरा शॉर्टकट एक संशोधक कुंजी के बिना जोड़ा जाता है।

कोई विचार? क्या यह शायद डेल्फी आईडीई/ओपन टूल्स एपीआई की ज्ञात सीमा/बग है? क्या कोई ज्ञात कामकाज है?

मैंने इसे डेल्फी 2007 और डेल्फी 10 सिएटल में कोई फर्क नहीं पड़ता, कोई फर्क नहीं पड़ता।

उत्तर

3

आपको GetKeyState फ़ंक्शन का उपयोग करके ऐसा करने में सक्षम होना चाहिए।

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

function IsKeyDown(const VK: integer): boolean; 
begin 
    IsKeyDown := GetKeyState(VK) and $8000 <> 0; 
end; 

procedure Form1.OnkeyDown(...) 
begin 
if Not H_MenuOpen then 
if IsKeyDown(vk_Control) and IskeyDown(vk_Shift) and IsKeyDown(vk_H) then 
begin 
     //Some Boolean in the form 
     H_MenuOpen:=True; 
     //Will probably need to invalidate some parameters here so that 
     //no control tries to process the key 
     exit; 
end; 

if H_MenuOpen then 
begin 
     if key=vk_X then 
     begin 
      //x has been pressed 
      *Your code here* 
      //possibly invalidate some of the params again 
      exit; 
     end; 
    //Nothing valid 
    H_MenuOpen:=False; 
end; 

अंत;

+0

धन्यवाद, यह सामान्य रूप से हॉटकी की जांच करने का एक समाधान है, लेकिन यह मेरे विशेष मामले पर लागू नहीं होता है जहां मेरे पास ऑनकेडाउन को संभालने के लिए कोई रूप नहीं है। (इसके अलावा: IKeyDown को कई बार कॉल करना अच्छा प्रदर्शन नहीं लगता है, मैं शायद केवल एक बार GetKeyState को कॉल करूँगा और कुंजी संयोजन की जांच करूँगा।) – dummzeuch

+0

हालांकि आप अभी भी एप्लिकेशन के लिए wm_keydown संदेश को संसाधित कर सकते हैं। –

+1

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

1

ठीक है, के बाद से जाहिरा तौर पर कोई भी एक जवाब मिल गया है, यहाँ मैं क्या कर समाप्त हो गया है:

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

BindingServices.AddKeyBinding([FirstShortCut], 
    TwoKeyBindingHandler, nil, 
    DefaultKeyBindingsFlag, '', ''); 

और TwoKeyBindingHandler विधि में, मैं एक पॉपअप मेनू जो शॉर्टकट के रूप में उन वर्ण हैं दिखा। आईडीई/वीसीएल/विंडोज़ फिर बाकी के लिए मेरे हैंडल करता है।

यह यह क्या लग रहा है की तरह है: animated GIF with the result

यह वास्तविक प्रश्न का उत्तर नहीं है लेकिन यह मेरी समस्या का हल। क्षमा करें अगर आप यहां कुछ और उम्मीद कर रहे हैं।

संबंधित मुद्दे