如何獲得按Ctrl,移或Alt鍵與getch()
ncurses的?
我無法得到它的工作就是讓按Ctrl,移或Alt鍵與getch()
使用ncurses的?我想念那個男人的東西嗎?如何使用getch()獲得Ctrl,Shift或Alt ncurses?
回答
驚人正確的答案如何被降級有時,和答案是「權威」放棄升職......隨着有點創意,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);
,就是這樣。在明確地說「不能」之前想一想。也許有一種不太明顯的方式。
其實這種方法不起作用。 – 2016-10-10 21:20:13
這對編寫跨多個鍵盤佈局的代碼無效。例如'Shift + 2'可以根據佈局生成不同的字符。 – 2016-11-23 19:58:05
你不能,任何主要的終端仿真器都無法實現它。
如果你假設一個X11環境,你可以使用X11函數來檢索它,但這完全是一個不同的問題。
(爲了大致我的回答從How to get Shift+X/Alt+X keys in Curses ?複製)
長話短說 - 你不能。修飾鍵就是那個 - 修飾符。它們本身並不存在,它們會修改您可能按下的其他(打印)鍵。
這就是說,如果你感覺特別勇敢,你可以試試我的libtermkey這將至少正確解析之類的東西按Ctrl - 箭頭。
最後,如果你感覺甚至勇敢就可以運行我寫的終端,pangoterm,其中有通用的方式來編碼任何任意修改的Unicode鍵,因此它可以區分按Ctrl - 米從輸入, 按Ctrl - 移 - 一個從按Ctrl - 一個,等...
然而,在這些之外,答案仍然是「你不能」。
您可以撥打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();
}
'getch'返回一個'chartype',而不是'char'。 – YoYoYonnY 2017-06-08 20:51:37
至少對於控制修改器有一個簡單的解決方案。詛咒已經從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
可能會或可能不會已經在你的代碼中定義。
我沒有嘗試過,但很高興知道爲什麼這是downvoted。 – 2017-05-17 23:20:31
達成一致(部分)與@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
。
- 1. 用Ctrl,Alt,Shift +鍵
- 2. 如何在循環中使用getch()(nCurses)
- 3. C#SendInput Alt/Ctrl/Shift鍵未獲得發佈
- 4. GitHub for Windows;禁用CTRL + SHIFT + ALT + C
- 5. 綁定Alt + Shift鍵按住Ctrl鍵
- 6. CTRL + ALT + SHIFT + A打開隱藏表格
- 7. 從python CLI讀取Ctrl,Alt和Shift鍵
- 8. 非阻塞getch(),ncurses
- 9. 嘗試使用使用ALT和ALT + SHIFT
- 10. 如何使用c#禁用Alt + Shift + Tab?
- 11. 如何禁用「Alt + Shift」組合鍵但保留「Alt + Shift + others」?
- 12. 帶「Ctrl,Shift或Alt」的Keydown事件不會在Windows上觸發
- 13. 使用NCurses獲取CTRL字符
- 14. 如何檢測在clickjs點擊事件中單擊+ [Shift,Ctrl,Alt]?
- 15. 從鼠標事件中獲取shift/ctrl/alt狀態?
- 16. 如何判斷在C#中是否正在點擊右Ctrl/Shift/Alt或Left?
- 17. 如何使用KeyAdapter檢測CTRL + SHIFT + ANY_KEY?
- 18. 如何在Curses中獲得Shift + X/Alt + X鍵?
- 19. WPF - 按下CTRL + SHIFT時如何捕獲?
- 20. 禁用CTRL-ALT-刪除,使用Alt-Tab
- 21. NCURSES和ESC,ALT鍵
- 22. 如何掛鉤CTRL + ALT + DEL
- 23. 如何掛鉤Ctrl-Alt-Tab?
- 24. RAWKEYBOARD標誌,檢查該標誌上,也SHIFT,CTRL和ALT
- 25. SL4的ListBoxDragDropTarget修飾鍵(Shift,Alt,Ctrl)功能。
- 26. 如何使Emacs(無GUI)區分Ctrl + Shift + S和Ctrl + S?
- 27. 如何在Eclipse中禁用Ctrl Alt M?
- 28. 如何使用getch()(來自curses庫)?
- 29. 如何檢查一個鍵修飾符是否被按下(shift,ctrl,alt)?
- 30. 鉤CTRL + ALT + TAB
控制,移位和alt不生成輸入,它們修改其他輸入。 – 2012-03-17 14:08:23
@SethCarnegie:我記得很多遊戲中你可以使用任何這些鍵進行個人操作。我相信每個密鑰都有某種獨特的掃描代碼。 – 2012-03-17 14:14:16
@KerrekSB雖然它們不會生成stdin的輸入。你可以測試它們是否是_down_(即Windows具有'GetAsyncKeyState'),但這與鍵盤一起工作,而不是像'getch'那樣的輸入。 – 2012-03-17 14:23:29