如何使用键盘的特殊键,如Command、Shift、Alt、Tab或C/C++程序中的功能键

How to use the special keys of the keyboard such as Command, Shift, Alt, Tab or the Function-Keys inside a C/C++-program?

本文关键字:程序 功能键 Tab C++ Shift 键盘 何使用 Command Alt      更新时间:2023-10-16

我的问题如下:

我想制作一个程序,一个简单的文本编辑器,它可以使用键盘的所有键,如功能键(F1到F12(、命令、左键、ALT或TAB

更确切地说,我希望能够将所有键分配给特定的操作。

我已经制作了一个程序来打印出这些键的ASCII值,但这些键并没有像我想的那样被接受,我的测试程序打印出几个ASCII代码的值,或者不像按命令键那样全部接受:

我的测试程序打印出按下的键的ASCII值:

#include <stdio.h> 
int main (void)
{
char k;
printf("nnnn");
while(1)
{
printf("Please press any key:");
k = getchar();
getchar();
printf("ASCII code of given input key: %d",k);
printf("nnn");
}
}

按下F2键后输出:

Please press any key:^[OQ
ASCII code of given input key: 27

Please press any key:ASCII code of given input key: 81

按下F2键后输出:

Please press any key:^[[15~
ASCII code of given input key: 27

Please press any key:ASCII code of given input key: 49

Please press any key:ASCII code of given input key: 126

按下命令键、Alt键或左键后输出:

Please press any key:               // no reaction at all

事实上,我认为这必须很容易做到,因为在一个程序中使用键盘的所有键当然是正常的,作为一个新手,要找到实现这一点的正确方法并不容易。

我在Stackoverflow上发现了这个问题,但它属于C#:键盘上的特殊键

为什么我不能获取这些键的ASCII值?

对不起,如果我可能有一个错误的印象,这些键属于ASCII值。

访问"特殊键"不是标准库的一部分,因为该语言不假设任何特定的I/O硬件,如屏幕和键盘,它只假设基于标准字符的I/O流,并且这些流上的数据与字符有关,而不是键。

因此,接收键盘事件和扫描代码以及特定于平台的。然而,有一些跨平台的方法可以让你在支持键盘的系统之间获得一些共性(比如台式电脑——并不是C运行的所有东西都是台式电脑(。

例如,对于文本控制台应用程序,例如在您的示例中,您可能会使用ncurses库,它是Unix curses库的克隆,并且在PDcurses中具有与Windows几乎等效的库。

例如,在这些curses变体中,您可以写:

int ch = getch() ;
if(ch == KEY_LEFT)
printw("Left arrow is pressedn");

在引擎盖下,它是平台特定手段的包装器。如果跨平台不是问题,您可以直接使用这些手段。例如,MSVC++有一个conio库,它有一个类似于上面的_getch()函数,只是对于非字符键,它返回0x00或0xE0,并在第二次调用时返回键代码。

对于GUI应用程序,应用程序消息循环将接收键盘事件,具体方式因系统而异,但也有跨平台的解决方案,例如Qt或WxWidgets。