दिलचस्प पोस्ट
कैसे पता लगाते हैं जब एक यूट्यूब वीडियो चलना खत्म हो जाए? डेटा असेंक पर आउटटाइम विधि में कैसे प्राप्त करें (डेटाटेंज) .htaccess – कैसे एक सामान्य तरीके से "www।" को मजबूर करने के लिए? जावास्क्रिप्ट में शैल कमांड को कैसे कार्यान्वित करें स्विफ्ट के माध्यम से कीबोर्ड के साथ दृश्य ले जाएं जावा सरणी क्रमबद्ध अवरोही? 2038 से परे PHP में तिथियां एक्सेस करना आप एक शर्त में एक असाइनमेंट का उपयोग क्यों करेंगे? जावा स्प्रिंग बूट: कैसे मेरे app रूट ("/") index.html को मैप करने के लिए? सर्कल के अंदर अंक चुनने के लिए MySQL स्थानिक एक्सटेंशन का उपयोग करें बनाम क्लास बनाम क्लासेस मैं TIMESTAMP कॉलम से दिनांक / समय की जानकारी कैसे प्राप्त करूं? क्या printf हमेशा बफ़र को एक नई पंक्ति का सामना करने पर फ्लश करता है? SQL सर्वर 2008 में पृष्ठ पर अंक लगाना कैसे करें जावा में छवि का आकार बदलना

मिलन और एरो कोड

मैं एक प्रोग्राम लिख रहा हूँ जो कि getch() arrow getch() लिए स्कैन करने के लिए getch() का उपयोग कर रहा है मेरा कोड अब तक है:

 switch(getch()) { case 65: // key up break; case 66: // key down break; case 67: // key right break; case 68: // key left break; } 

समस्या यह है कि जब मैं 'A' , 'B' , 'C' या 'D' को दबाएगा, तो भी निष्पादित होगा, क्योंकि 65 'A' के लिए दशमलव कोड है, आदि …

कॉल दूसरों के बिना एक तीर कुंजी की जांच करने का एक तरीका है?

धन्यवाद!

वेब के समाधान से एकत्रित समाधान "मिलन और एरो कोड"

एक तीर कुंजी getch दबाने से बफर में तीन मान हो जाएंगे:

  • '\033'
  • '['
  • 'A' , 'B' , 'C' या 'D'

तो कोड कुछ ऐसा होगा:

 if (getch() == '\033') { // if the first value is esc getch(); // skip the [ switch(getch()) { // the real value case 'A': // code for arrow up break; case 'B': // code for arrow down break; case 'C': // code for arrow right break; case 'D': // code for arrow left break; } } 

getch () फ़ंक्शन तीर कुंजी (और कुछ अन्य विशेष कुंजी) के लिए दो कुंजीकोड देता है, जैसा कि FatalError द्वारा टिप्पणी में उल्लिखित है। यह पहले 0 (0x00) या 224 (0xE0) को वापस देता है, और फिर उस कुंजी को पहचानने वाला कोड देता है जिसे दबाया गया था।

तीर कुंजियों के लिए, यह 224 पहले क्रमवार 72 (ऊपर), 80 (नीचे), 75 (बाएं) और 77 (दाएं) के साथ आता है। अगर संख्या-पैड तीर कुंजी (नमुलॉक बंद के साथ) दबाई जाती है, तो getch () 224 के स्थान पर बदले में 0 देता है।

कृपया ध्यान दें कि getch () किसी भी तरह से मानकीकृत नहीं है, और ये कोड कंपाइलर से कंपाइलर तक भिन्न हो सकते हैं इन कोडों को विंडोज़ पर मिनजीड और विज़ुअल सी ++ द्वारा लौटा दिया गया है।

विभिन्न कुंजी के लिए getch () की कार्रवाई देखने के लिए एक आसान प्रोग्राम है:

 #include <stdio.h> #include <conio.h> int main () { int ch; while ((ch = _getch()) != 27) /* 27 = Esc key */ { printf("%d", ch); if (ch == 0 || ch == 224) printf (", %d", _getch ()); printf("\n"); } printf("ESC %d\n", ch); return (0); } 

यह मिनगू और विजुअल सी ++ के लिए काम करता है ये कंपाइलर्स getch () के बजाय नाम _getch () का उपयोग करने के लिए इंगित करते हैं कि यह एक गैर मानक फ़ंक्शन है।

तो, आप ऐसा कुछ कर सकते हैं:

 ch = _getch (); if (ch == 0 || ch == 224) { switch (_getch ()) { case 72: /* Code for up arrow handling */ break; case 80: /* Code for down arrow handling */ break; /* ... etc ... */ } } 

तो, संघर्ष के बहुत बाद, मैंने चमत्कारिक रूप से इस सदाबहार मुद्दे को हल किया! मैं एक लिनक्स टर्मिनल की नकल करने की कोशिश कर रहा था और उस भाग में फंस गया था जहां यह एक कमांड इतिहास रखता है जिसे ऊपर या नीचे तीर कुंजियों को दबाकर एक्सेस किया जा सकता है मुझे पता चल गया कि सीखने में धीमी और धीमी गति से दर्द होना मुश्किल है।

 char ch = 0, k = 0; while(1) { ch = getch(); if(ch == 27) // if ch is the escape sequence with num code 27, k turns 1 to signal the next k = 1; if(ch == 91 && k == 1) // if the previous char was 27, and the current 91, k turns 2 for further use k = 2; if(ch == 65 && k == 2) // finally, if the last char of the sequence matches, you've got a key ! printf("You pressed the up arrow key !!\n"); if(ch == 66 && k == 2) printf("You pressed the down arrow key !!\n"); if(ch != 27 && ch != 91) // if ch isn't either of the two, the key pressed isn't up/down so reset k k = 0; printf("%c - %d", ch, ch); // prints out the char and it's int code 

यह बोल्ड की तरह है लेकिन यह बहुत कुछ बताता है सौभाग्य !

keypad उपयोगकर्ता के टर्मिनल के कीबोर्ड को फ़ंक्शन कुंजियों को एकल मान (यानी कोई एस्केप अनुक्रम) के रूप में व्याख्या करने के लिए अनुमति देने के लिए अनुमति देगा।

जैसा कि मैन पेज में बताया गया है:

कीपैड विकल्प उपयोगकर्ता के टर्मिनल की कीपैड को सक्षम करता है। यदि सक्षम है (बीएफ सच है), तो उपयोगकर्ता एक फ़ंक्शन कुंजी (जैसे कि एक तीर कुंजी) दबा सकता है और wgetch फ़ंक्शन कुंजी का प्रतिनिधित्व करने वाला एक एकल मान देता है, जैसा कि KEY_LEFT में है यदि अक्षम (बीएफ गलत है), तो curses विशेष रूप से फ़ंक्शन कुंजी का इलाज नहीं करता है और प्रोग्राम को एस्केप अनुक्रमों को स्वयं व्याख्या करना है यदि टर्मिनल में कीपैड को चालू किया जाता है (ट्रांसमिट किया जाता है) और बंद (स्थानीय स्तर पर काम करने के लिए बनाया गया), इस विकल्प को चालू करने से टर्मिनल कीपैड को चालू किया जा सकता है जब wgetch कहा जाता है कीपैड के लिए डिफ़ॉल्ट मान गलत है I

दरअसल, तीर कुंजियों को पढ़ने के लिए एक को अपना स्कैन कोड पढ़ने की आवश्यकता है। नीचे तीर कुंजी दबाकर स्कैन कोड है (कुंजी रिहाई नहीं)

जब अंक लॉक बंद है

  • वाम E0 4 बी
  • सही ई0 4 डी
  • E0 48 ऊपर
  • नीचे E0 50

जब एनओएम लॉक इन चाबियों पर है, तो ई 2 2 ए के साथ आने से पहले

  • बाइट ई 0 है -32
  • बाइट 48 72 यूपी हैं
  • बाइट 50 80 डाउन है

     user_var=getch(); if(user_var == -32) { user_var=getch(); switch(user_var) { case 72: cur_sel--; if (cur_sel==0) cur_sel=4; break; case 80: cur_sel++; if(cur_sel==5) cur_sel=1; break; } } 

उपरोक्त कोड में मैंने ग्रहण किया है कि प्रोग्रामर केवल 4 लाइनों को स्थानांतरित करना चाहता है।

समाधान के लिए जो काम कर रहे कोड के साथ ncurses का उपयोग करता है और ncurses के प्रारंभ में getchar () ऊपर और नीचे तीर कुंजियों के लिए समान मूल्य (27) देता है

मैंने एआरओ कोड पाने के लिए getch का उपयोग करते हुए एक फ़ंक्शन लिखी है। यह एक त्वरित नकारार्थी समाधान है लेकिन फ़ंक्शन एआरआई कुंजी के आधार पर एक एएससीआईआई कोड वापस करेगा: यूपी: -10 नीचे: -11 सही: -12 बाएं: -13

इसके अलावा, इस समारोह के साथ, आप एस्केप स्पर्श और तीर कुंजियों को अलग करने में सक्षम होंगे। लेकिन आपको ESC को सक्रिय करने के लिए 2 बार ईएससी प्रेस करना होगा।

यहां कोड:

 char getch_hotkey_upgrade(void) { char ch = 0,ch_test[3] = {0,0,0}; ch_test[0]=getch(); if(ch_test[0] == 27) { ch_test[1]=getch(); if (ch_test[1]== 91) { ch_test[2]=getch(); switch(ch_test[2]) { case 'A': //printf("You pressed the up arrow key !!\n"); //ch = -10; ch = -10; break; case 'B': //printf("You pressed the down arrow key !!\n"); ch = -11; break; case 'C': //printf("You pressed the right arrow key !!\n"); ch = -12; break; case 'D': //printf("You pressed the left arrow key !!\n"); ch = -13; break; } } else ch = ch_test [1]; } else ch = ch_test [0]; return ch; }