2012-03-17 181 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

相关问题