2012-03-17 136 views
6

如何獲得按CtrlAlt鍵getch() ncurses的?
我無法得到它的工作就是讓按CtrlAlt鍵getch()使用ncurses的?我想念那個男人的東西嗎?如何使用getch()獲得Ctrl,Shift或Alt ncurses?

+4

控制,移位和al​​t不生成輸入,它們修改其他輸入。 – 2012-03-17 14:08:23

+0

@SethCarnegie:我記得很多遊戲中你可以使用任何這些鍵進行個人操作。我相信每個密鑰都有某種獨特的掃描代碼。 – 2012-03-17 14:14:16

+1

@KerrekSB雖然它們不會生成stdin的輸入。你可以測試它們是否是_down_(即Windows具有'GetAsyncKeyState'),但這與鍵盤一起工作,而不是像'getch'那樣的輸入。 – 2012-03-17 14:23:29

回答

14

驚人正確的答案如何被降級有時,和答案是「權威」放棄升職......隨着有點創意,KEY_NAME實際持有的右鍵可搞清楚了這一點,有一點需要注意 - 那SHIFT/ALT/CTRL被壓在同一時間其他鍵:

  • 首先,對於「正常鍵」如可打印的,你可以很容易地檢測到因爲大寫而移位。

  • 對於特殊的鍵,例如KEY_LEFT,您將看到選擇SHIFT時生成的代碼實際上是KEY_SLEFT。同上KEY_RIGHT。不幸的是,KEY_UP/KEY_DOWN沒有這樣的運氣,SHIFT似乎沒有這樣的運氣。所以你可以通過getch()中的返回字符來區分 - KEY_S ..意味着按下了shift。

  • 對於ALT(什麼不被X或Aqua Windowmanager至少捕獲),keyname會將該鍵轉換爲M ...某物。

  • 對於CTRL,您將在實際鍵名稱前獲得一個「^」。關鍵18

E.g^R所以,你現在可以計算出密鑰代碼爲交換機(殘培)語句等,通過簡單的代碼片段:

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

,就是這樣。在明確地說「不能」之前想一想。也許有一種不太明顯的方式。

+3

其實這種方法不起作用。 – 2016-10-10 21:20:13

+0

這對編寫跨多個鍵盤佈局的代碼無效。例如'Shift + 2'可以根據佈局生成不同的字符。 – 2016-11-23 19:58:05

0

你不能,任何主要的終端仿真器都無法實現它。

如果你假設一個X11環境,你可以使用X11函數來檢索它,但這完全是一個不同的問題。

5

(爲了大致我的回答從How to get Shift+X/Alt+X keys in Curses ?複製)

長話短說 - 你不能。修飾鍵就是那個 - 修飾符。它們本身並不存在,它們會修改您可能按下的其他(打印)鍵。

這就是說,如果你感覺特別勇敢,你可以試試我的libtermkey這將至少正確解析之類的東西按Ctrl - 箭頭

最後,如果你感覺甚至勇敢就可以運行我寫的終端,pangoterm,其中有通用的方式來編碼任何任意修改的Unicode鍵,因此它可以區分按Ctrl - 輸入按Ctrl - - 一個按Ctrl - 一個,等...

然而,在這些之外,答案仍然是「你不能」。

0

您可以撥打key_name(c)將產生的密鑰從getch()轉換爲顯示ctrl-modifier狀態的內容。

例如這個代碼顯示「^ R」如果你按下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

'getch'返回一個'chartype',而不是'char'。 – YoYoYonnY 2017-06-08 20:51:37

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

我沒有嘗試過,但很高興知道爲什麼這是downvoted。 – 2017-05-17 23:20:31

0

達成一致(部分)與@leonerd,ncurses的將給你的鑰匙,因爲它們被用作修飾其他鍵(忽略ASCII 轉義字符其中一些人與Alt鍵混淆鍵)。可以告訴某些特定的設備提供這些信息(例如,如在console_ioctl(4)中記錄的Linux控制檯),但這不是ncurses將爲您解決的問題。

請參考ncurses常見問題解答How can I use shift- or control-modifiers?瞭解很長的答案。

但短期:ncurses的不告訴你,如果使用一個給定的改性劑(除了那裏有轉變知名用途特殊情況),而是它的終端通過描述

提供的信息,無論是
  • 將實際功能鍵乘以移位和控制修飾符的組合,或者使用基於xterm的PC風格功能鍵(shift是2,alt是3,control是5等)的名稱與
  • 提供信息。

有兩種方法,因爲首先使用不超過60個的功能鍵的陣列(對於倒班和控制組合足夠好),而另一隻使用用戶定義名稱)。

所有這些修改過的鍵都給出了多個字節;在ncurses中使用keypad()(當然)的應用程序會得到一個數字。在後一種情況下,鍵碼是在運行時確定的。

這主要適用於特殊鍵(功能鍵,編輯鍵和光標鍵)。對於常規的鑰匙,人們可能會認爲keyname給出了一些特殊的行爲,但閱讀說明它沒有:

  • 它報告的ASCII控制字符(你可以使用iscntrl宏做),並
  • 品牌關於meta的假設(僅對xterm有用,您可能使用的終端有效)和
  • 轉變修改器沒有幫助。

終端...內部都有修飾符信息,但終端通常沒有辦法將這些信息傳遞給應用程序。 xterm可以做到這一點使用modifyOtherKeys資源,

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

相關問題