2012-03-17 19 views
6

कैसे प्राप्त करने के लिए Ctrl, शिफ्ट या getch() ncurses साथ Alt?
मैं नहीं मिल यह Ctrl, शिफ्ट या getch() ncurses उपयोग करने के साथ Alt प्राप्त करने के लिए काम कर सकते हैं? क्या मुझे आदमी में कुछ याद आती है?getch() ncurses के साथ Ctrl, Shift या Alt कैसे प्राप्त करें?

+4

नियंत्रण, शिफ्ट, और alt इनपुट उत्पन्न नहीं करते हैं, वे अन्य इनपुट संशोधित करते हैं। –

+0

@ सेठ कार्नेगी: मुझे कई गेम याद हैं जहां आप व्यक्तिगत कार्यों के लिए इनमें से किसी भी कुंजी का उपयोग कर सकते हैं। मुझे लगता है कि प्रत्येक कुंजी में अद्वितीय स्कैन कोड का कुछ प्रकार होता है। –

+1

@KerrekSB हालांकि वे stdin में इनपुट उत्पन्न नहीं करते हैं। आप जांच सकते हैं कि वे _down_ हैं या नहीं (यानी विंडोज़ में 'GetAsyncKeyState' है), लेकिन यह कुंजीपटल के साथ काम कर रहा है, न कि' getch' करता है जैसे इनपुट के साथ। –

उत्तर

14

कमाल कैसे कभी कभी सही जवाब पदावनत हो जाता है, और जवाब है कि "आधिकारिक" दे ऊपर पदोन्नत हो ... के साथ ,

  • सबसे पहले "सामान्य कुंजी" के लिए: कि बदलाव/एएलटी/CTRL एक ही समय में अन्य कुंजियों के साथ दबाया जाता है - रचनात्मकता का एक सा, KEY_NAME वास्तव में सही कुंजी इस पता लगाना करने के लिए, एक चेतावनी के साथ रखती है जैसे प्रिंट करने योग्य वाले, आप आसानी से शिफ्ट का पता लगा सकते हैं क्योंकि यह अपरकेस करता है।

  • विशेष कुंजी के लिए, उदा। KEY_LEFT, आप देखेंगे कि SHIFT चयनित होने पर उत्पन्न कोड वास्तव में KEY_SLEFT है। KEY_RIGHT के लिए ditto। दुर्भाग्य से, KEY_UP/KEY_DOWN के लिए ऐसी कोई किस्मत नहीं है, जो SHIFT द्वारा अजीब लगती है। तो आप वापसी वाले चार से getch() - KEY_S से अंतर कर सकते हैं .. तात्पर्य है कि शिफ्ट दबाया गया था।

  • एएलटी के लिए (कम से कम एक्स या एक्वा विंडोमैनर द्वारा फंस नहीं गया है), कुंजीनाम कुंजी को एम में परिवर्तित कर देगा ... कुछ।

  • CTRL के लिए आपको वास्तविक कुंजी नाम से पहले "^" मिल जाएगा। कुंजी 18

के लिए उदा^आर तो अब बाहर कुंजी कोड अपने स्विच (getch) बयान, आदि के लिए, लगा सकते हैं एक सरल टुकड़ा द्वारा:

ch = getch(); endwin(); printf("KEY NAME : %s - %d\n", keyname(ch),ch); 

और कहा कि कि है। निश्चित रूप से "नहीं कर सकते" कहने से पहले सोचें। शायद एक रास्ता है जो कम स्पष्ट है।

+3

वास्तव में यह दृष्टिकोण काम नहीं करता है। –

+0

यह कोड लिखने में मदद नहीं करता है जो एकाधिक कीबोर्ड लेआउट में काम करता है। उदाहरण के लिए 'Shift + 2' लेआउट के आधार पर अलग-अलग वर्ण उत्पन्न कर सकता है। –

0

आप नहीं कर सकते हैं, इसे प्राप्त करने के लिए किसी भी प्रमुख टर्मिनल अनुकरणकर्ताओं में कोई विस्तार नहीं है।

यदि आप X11 वातावरण मान रहे हैं तो आप इसे पुनर्प्राप्त करने के लिए X11 फ़ंक्शंस का उपयोग कर सकते हैं, लेकिन यह एक अलग प्रश्न है।

5

(मोटे तौर पर How to get Shift+X/Alt+X keys in Curses ? से मेरा उत्तर कॉपी करने के लिए)

लंबी कहानी छोटी - आप नहीं कर सकते। संशोधक कुंजी बस यही हैं - संशोधक। वे अपने अधिकार में मौजूद नहीं हैं, वे कुछ अन्य (प्रिंटिंग) कुंजी को संशोधित करते हैं जिन्हें आप दबा सकते हैं।

कहा, यदि आप विशेष रूप से बहादुर महसूस कर रहे हैं, तुम मेरे libtermkey कोशिश कर सकते हैं जो कम से कम सही ढंग से जैसी चीजों को पार्स जाएगा Ctrl - तीर

अंत में अगर आप, बहादुर आप टर्मिनल मैंने लिखा, pangoterm, जो किसी भी मनमाने ढंग से संशोधित यूनिकोड कुंजी एन्कोड करने के लिए सामान्य तरीके हैं चला सकते हैं भी महसूस कर रहे हैं तो यह भेद कर सकते हैं Ctrl - मीटरसे दर्ज करें, Ctrl - शिफ्ट - एकCtrl से - एक, आदि ...

हालांकि, इनमें से, जवाब "आप नहीं कर सकते" रहता है।

0

getch() से उत्पन्न कुंजी को बदलने के लिए आप key_name(c) पर कॉल कर सकते हैं जो आपको ctrl-modifier की स्थिति दिखाता है।

उदाहरण के लिए इस कोड से पता चलता "^ आर" यदि आप Ctrl-R दबाएँ:

while(true) 
{ 
    char c = getch(); 
    if (ERR == c) 
     break; 

    const char *name = key_name(c); 

    move(2, 2); 
    clear(); 
    printw("You entered: %s    ", name); 
    refresh(); 

} 
+0

'गेटच' एक 'चार्ट टाइप' देता है, न कि 'char'। – YoYoYonnY

1

कम से कम नियंत्रण संशोधक के लिए एक सरल समाधान है। शाप vi स्रोत कोड है, जिसमें आप निम्नलिखित को खोजने से प्राप्त किया गया था (देखें https://github.com/n-t-roff/ex-1.1/blob/master/ex.h लाइन 77 और https://github.com/n-t-roff/ex-1.1/blob/master/ex_vops.c लाइन 445): इस्तेमाल किया

#ifndef CTRL 
#define CTRL(c) ((c) & 037) 
#endif 

switch(getch()) { 
case CTRL('r'): 
    /* key ctrl-r (i.e. ^R) pressed */ 

dependend पर शामिल CTRL या पहले से ही अपने कोड में परिभाषित किया गया नहीं हो सकता है।

+1

मैंने इसे आजमाया नहीं है, लेकिन यह जानना अच्छा होगा कि यह क्यों कम हो गया था। –

0

@leonerd साथ (आंशिक रूप से) सहमत, ncurses केवल आप उन कुंजियां दूंगा रूप में वे संशोधक के रूप में उपयोग किया जाता है अन्य कुंजियों (ASCII अनदेखी भागने चरित्र जो कुछ लोगों को Alt के साथ भ्रमित करने के लिए कुंजी)। कुछ विशिष्ट उपकरणों को यह जानकारी देने के लिए कहा जा सकता है (उदाहरण के लिए, लिनक्स कंसोल console_ioctl(4) में प्रलेखित के रूप में), लेकिन यह कोई समस्या नहीं है कि ncurses आपके लिए हल हो जाएंगे।

लंबे उत्तर के लिए ncurses FAQ How can I use shift- or control-modifiers? देखें।

लेकिन कम: ncurses आपको बता नहीं करता है तो एक दिया संशोधक (विशेष मामलों में जहां पारी के जाने-माने का उपयोग करता है वहाँ थे को छोड़ कर) इस्तेमाल किया गया था, बल्कि अपने टर्मिनल विवरण

द्वारा जानकारी या तो प्रदान करते हैं
  • Shift- और नियंत्रण-संशोधक के संयोजन द्वारा वास्तविक समारोह चाबियाँ गुणा, या
  • नामों का उपयोग करके टर्म के पीसी शैली समारोह चाबियाँ (पाली, 2 है alt 3 है, नियंत्रण 5, आदि), के आधार पर जानकारी प्रदान करें।

वहाँ है, जबकि अन्य अभी उपयोगकर्ता परिभाषित नाम का उपयोग करता है), क्योंकि पहले कोई 60 से अधिक समारोह चाबियों का एक सरणी (Shift- और नियंत्रण-संयोजन के लिए काफी अच्छा) का उपयोग करता है दो दृष्टिकोण हैं।

इन सभी संशोधित कुंजी कई बाइट्स देते हैं; ncurses में keypad() (बेशक) का उपयोग कर एक आवेदन एक एकल नंबर प्राप्त होगा। बाद के मामले में, कीकोड रनटाइम पर निर्धारित होते हैं।

जो मुख्य रूप से विशेष कुंजी (फ़ंक्शन-, संपादन- और कर्सर-कुंजी) पर लागू होता है।नियमित रूप से कुंजी के लिए, एक मान सकते हैं कि keyname कुछ विशेष व्यवहार देता है, लेकिन उसके विवरण को पढ़ने यह नहीं है:

  • यह ASCII नियंत्रण वर्ण रिपोर्ट (जो आप iscntrl मैक्रो का उपयोग कर सकते हैं), और
  • बनाता है मेटा के बारे में धारणाएं (जो केवल xterm के लिए उपयोगी हैं, जिन टर्मिनलों का उपयोग करने की संभावना है), और
  • शिफ्ट संशोधक के लिए कोई सहायता प्रदान नहीं करता है।

टर्मिनलों में ... सभी में आंतरिक रूप से संशोधक जानकारी उपलब्ध है, लेकिन टर्मिनलों के पास आमतौर पर इस जानकारी को एप्लिकेशन में पास करने का कोई तरीका नहीं है। xtermmodifyOtherKeys संसाधन का उपयोग कर ऐसा कर सकते हैं,

modifyOtherKeys (class ModifyOtherKeys) 
      Like modifyCursorKeys, tells xterm to construct an escape 
      sequence for other keys (such as "2") when modified by 
      Control-, Alt- or Meta-modifiers. This feature does not apply 
      to function keys and well-defined keys such as ESC or the 
      control keys. The default is "0": 

      0 disables this feature. 

      1 enables this feature for keys except for those with well- 
       known behavior, e.g., Tab, Backarrow and some special 
       control character cases, e.g., Control-Space to make a 
       NUL. 

      2 enables this feature for keys including the exceptions 
       listed. 

जो एक नियंत्रण अनुक्रम से मेल खाती है, XTerm Control Sequences में देखी गई:

CSI > Ps; Ps m 
      Set or reset resource-values used by xterm to decide whether 
      to construct escape sequences holding information about the 
      modifiers pressed with a given key. The first parameter iden- 
      tifies the resource to set/reset. The second parameter is the 
      value to assign to the resource. If the second parameter is 
      omitted, the resource is reset to its initial value. 
      Ps = 0 -> modifyKeyboard. 
      Ps = 1 -> modifyCursorKeys. 
      Ps = 2 -> modifyFunctionKeys. 
      Ps = 4 -> modifyOtherKeys. 

लेकिन (एक xterm-विशिष्ट सुविधा जा रहा है), वहाँ इसका इस्तेमाल करने की कोई कारण नहीं है ncurses में: यह getch जटिलता से जटिल होगा।

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