【问题标题】:How do I make my program do a specific thing after I press a certain key on my keyboard?在我按下键盘上的某个键后,如何让我的程序执行特定的操作?
【发布时间】:2020-09-02 12:41:49
【问题描述】:
#include <stdlib.h>
#include <stdio.h>


int main()
{
    char ch;
    
    printf("Enter any character: \n");
    ch = fgetc(stdin);
    
    if(ch == 'A')
    {
        printf("A was inputed.\n");
    }
    else
    {
        printf("%c was inputed.\n", ch);
    }
    
    return 0;
}

所以这是一个简单的程序:当你输入 A 并按下回车键时,“A was inputed”会打印出来。如果您输入任何其他字符,它将打印“已输入。”

但我想这样:当右箭头键按下时,它会打印“右箭头键”,但是当左箭头键按下 >,它将打印“左箭头键”。

我该怎么做?

我可以用回车键来做这个。

if(ch == 0x0A)
{
printf("ENTER KEY was pressed\n");
}
else
{

}

我了解到 0x0A 是回车键的十六进制 ASCII 值。所以我想在我得到它们的十六进制 ASCII 值后,我可以对其他键做同样的事情。但我不知道右箭头和左箭头键的那些。

编辑:我应该提到我使用的是 Windows 10。

【问题讨论】:

  • 以下链接可能会有所帮助:stackoverflow.com/questions/2876275/…
  • 还有缓冲问题。我认为我们不能假设 fgetc() 会在单次击键后立即返回。如果这是 Linux 和标准终端仿真器,我有可以处理这些问题的示例代码。如果是 Linux,ncurses 提供了易于理解的方法来处理键码转换和缓冲。
  • 如果您在 Windows 上,或者针对 Windows,我建议使用 WinApi docs.microsoft.com/en-us/windows/win32/learnwin32/… 它们允许您检测所有听起来像您想要的键(据我所知)。在 linux 上,您可能必须通过 ASCII 键(或者如果在给定系统上可用的函数)
  • 您使用的是什么操作系统?

标签: c console ascii


【解决方案1】:

您还没有指定操作系统...

这个答案将从 Windows 的角度解决这个问题。

两个可以简化您在 Windows 环境中的任务的项目:

与其他所有键盘定义一起,确实包括箭头键:

  • VK_LEFT 0x25 LEFT ARROW key

  • VK_UP 0x26 UP ARROW key

  • VK_RIGHT 0x27 RIGHT ARROW key

  • VK_DOWN 0x28 DOWN ARROW key

这些可用于使您的代码能够捕获单个击键以及击键组合,检测 instantaneoushold 状态,所有这些都有助于确定状态的键盘。使用这些,您的代码示例可以这样实现:

void GetAppState(void)
{
    short state=0;
    short state1=0;
    
    state = GetAsyncKeyState(VK_RETURN);
    if (0x80000000 & state) //check instantaineous state of key
    {
       printf("ENTER KEY was pressed\n");
    }
    else
    {
        ...
    } 
    ...... and so on

要捕获多个同时击键,您可以执行类似的操作(例如捕获&lt;ctrl&gt;&lt;shift&gt;&lt;h&gt;

state = GetAsyncKeyState(VK_CONTROL);
    if (0x80000000 & state) //check instantaineous state of key
    {
        state = GetAsyncKeyState(VK_SHIFT); 
        if (0x80000000 & state) //check instantaineous state of key
        {
            state = GetAsyncKeyState('h'); 
            state1 = GetAsyncKeyState('H'); 
            if ((0x80000000 & state) || 
                (0x80000000 & state1))
            {    
 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2012-08-28
    • 2020-07-14
    相关资源
    最近更新 更多