2011-06-13 2 views
5

का उपयोग करके मैं एक कुंजी दबाए जाने पर एक बुलियन ईवेंट टॉगल करना चाहता हूं। विशेष रूप से, 'कुंजी' कुंजी। मुझे GetKeyState() फ़ंक्शन की ओर इशारा किया गया है, जो माना जाता है कि Win32 API के अंतर्गत काम करता है। मैं पत्र 'एस' 115 है के लिए ASCII कोड को समझते हैं, और इसलिए मेरे कोड इस प्रकार है के रूप में:GetKeyState()

if (GetKeyState(115) == 1) 
{ 
<EVENT> 
} 

बहरहाल, यह काम नहीं करता। क्यूं कर? यहाँ MSDN संदर्भ है: http://msdn.microsoft.com/en-us/library/ms646301%28v=vs.85%29.aspx ... "कम आदेश बिट 1 है, तो कुंजी चालू किए जाने पर"

उत्तर

14

मैं क्या समझ से आप क्या करने की जरूरत:

if(GetKeyState(115) & 0x8000) 
{ 
    <EVENT> 
} 

उच्चतम बिट अगर बताता है कुंजी दबाया जाता है। सबसे कम बताता है कि कुंजी को टॉगल किया गया है (जैसे, यदि कैप्स लॉक चालू है)।

+1

धन्यवाद, मैंने यह कोशिश की है लेकिन फिर भी जब मैं प्रेस करता हूं तो मेरा ईवेंट नहीं होता है। कार्यक्रम हालांकि ठीक है हालांकि। मैं Win32 एपीआई का उपयोग कर रहा हूँ, क्या मुझे कुछ और याद आ रही है? संकलक स्पष्ट रूप से फ़ंक्शन को पहचानता है ... – CaptainProg

+0

शायद आप [GetAsyncKeyState] (http://msdn.microsoft.com/en-us/library/ms646293) चाहते हैं। कीबोर्ड ईवेंट के जवाब में 'GetKeyState' को कॉल किया जाना है। –

+0

अक्षर कुंजी के लिए वर्चुअल कुंजी कोड ऊपरी केस अक्षरों के ASCII कोड से मेल खाते हैं। और आप 'int' के बजाय 'char' का भी उपयोग कर सकते हैं जो कोड को और अधिक पठनीय बनाता है। तो 'GetKeyState (' S ')' – kiw

-5

इसके लिए देर हो चुकी है लेकिन उच्च ऑर्डर बिट 0x80000000 0x8000 नहीं है, इसे बदलें और यह ठीक काम करेगा।

अन्य बिट - कुछ भी नहीं - यह काम करता है जैसे आपने एलएसएचआईएफटी दबाए जाने पर सीएपीएस लॉक दबाया।

+5

"जैसा कि [GetKeyState MSDN संदर्भ] में बताया गया है (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646301 (v = vs.85) .aspx), वापसी मूल्य एक 'लघु' (16 बिट्स) है, 32 बिट मान नहीं है (दूसरे शब्दों में, '0x80000000' मान्य नहीं है)। – EDDY74

5

चूंकि लघु हस्ताक्षरित है, उच्च-आदेश बिट साइन बिट के बराबर है।

इसलिए परीक्षण करने के लिए करता है, तो किसी कुंजी दबाया जाता है, बस का परीक्षण करता है, तो GetKeyState() द्वारा दिए गए मान ऋणात्मक है:

if (GetKeyState('S') < 0) { 
    // The S key is down. 
} else { 
    // The S key is up. 
} 

इसके अलावा, 115 'एस' के लिए ASCII कोड है। मेरा मानना ​​है कि आपको 'एस' कुंजी का परीक्षण करने के लिए पूंजीगत केस 83 का उपयोग करना चाहिए।