如何获得按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. C#SendInput Alt/Ctrl/Shift键未获得发布
- 2. GitHub for Windows;禁用CTRL + SHIFT + ALT + C
- 3. 从python CLI读取Ctrl,Alt和Shift键
- 4. 非阻塞getch(),ncurses
- 5. 尝试使用使用ALT和ALT + SHIFT
- 6. 如何使用c#禁用Alt + Shift + Tab?
- 7. 如何禁用“Alt + Shift”组合键但保留“Alt + Shift + others”?
- 8. 带“Ctrl,Shift或Alt”的Keydown事件不会在Windows上触发
- 9. 从鼠标事件中获取shift/ctrl/alt状态?
- 10. 如何检测在clickjs点击事件中单击+ [Shift,Ctrl,Alt]?
- 11. 如何判断在C#中是否正在点击右Ctrl/Shift/Alt或Left?
- 12. 如何使用KeyAdapter检测CTRL + SHIFT + ANY_KEY?
- 13. 如何在Curses中获得Shift + X/Alt + X键?
- 14. WPF - 按下CTRL + SHIFT时如何捕获?
- 15. NCURSES和ESC,ALT键
- 16. 如何挂钩Ctrl-Alt-Tab?
- 17. SL4的ListBoxDragDropTarget修饰键(Shift,Alt,Ctrl)功能。
- 18. 如何使Emacs(无GUI)区分Ctrl + Shift + S和Ctrl + S?
- 19. 钩CTRL + ALT + TAB
- 20. 如何检查一个键修饰符是否被按下(shift,ctrl,alt)?
- 21. 如何防止Gnome拦截Alt + Shift +〜键?
- 22. Ctrl或Shift在每个浏览器
- 23. 如何使用SendKeys函数使用Ctrl + Alt + C
- 24. 如何使用Ruby检测是否在Windows平台上按下SHIFT或ALT键?
- 25. 如何使用Win + Shift + Alt作为AutoHotkey中的热键?
- 26. Aspose.Cells在条件格式中使用数组(Ctrl + Shift + Enter或CSE)
- 27. HTML \ Javascript - 获取ATL \ CTRL \ SHIFT键按
- 28. 如何缩进/按Ctrl + Shift + F键
- 29. 如何在C文件中使用带F12或Ctrl-Shift-O的JUMP功能?
- 30. Python 2.7 - 如何检查SHIFT-KEY或CTRL +键是否被按下?
控制,移位和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