如何确定C++中的按键

How do determine key presses in C++

本文关键字:何确定 C++      更新时间:2023-10-16

我正在开发一个要在Linux系统上使用的CHIP-8模拟器。 据我了解,我需要从(任何)16 个键获取键盘输入并将其映射到十六进制键盘。 获得输入后,我可以毫不费力地将它们映射到 16 个 CHIP-8 键。

但是,我不知道如何实际判断是否按下了某个键。 我相信在Java中我会使用keylistener,但我在C++中找不到任何类似Linux的东西。 有没有办法告诉我在任何给定时间按下了什么(如果有的话)特定键? 我可以调用类似 getKeyState 函数的东西?

提前谢谢。

ncurses上有这个教程。 NCURSES 编程方法。 我已经确认,在我的MacBook Pro上,Mavericks 10.9.1,安装了Xcode命令行工具,该ncurses.h是指向curses.h的符号链接,两者都位于/usr/include。 这是NCURSES简介页面。

我自己没有创建特定的类。 然而,一些搜索/dev/input/eventX,其中X似乎是零或一找到这两个单独的帖子:从/dev/input和linux按键事件中读取。

程序可能会从标准输入中读取字符。

您可以使用fgets()库函数来执行读取。

例如,请参阅:

  • http://linux.die.net/man/3/fgets
  • 如何读取用户在 C 中输入的字符串
我相信

推荐的方法是使用 @CPlusPlus OOA 和 D 已经提到的 ncurses。

尽管您可以使用以下代码实现非阻塞"按键检测器":

#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <vector>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
int kbhit(void) {
    struct termios oldt, newt;
    int ch;
    int oldf;
    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
    fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
    ch = getchar();
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    fcntl(STDIN_FILENO, F_SETFL, oldf);
    if(ch != EOF) {
        ungetc(ch, stdin);
        return 1;
    }
    return 0;
}
char get_char(){
    int k;
    int i = 0;
    while(i == 0){
        if(kbhit()){
            k = _getch();
            i++;
        }
    }
    return char(k);
}
int main() {
    while(1) {
        while(!kbhit()) {
            // Works continuously until interrupted by keyboard input.
            printf("Continuous...n");
        }
        int c = get_char(); 
        std::cout << c;
        break; // Or whatever you want to do...
    }
    return 0;
} 

在 linuxOS 中,您可以在stdio.h头文件中使用: getchar函数。下面是一个示例:

#include <iostream>
#include <stdio.h>
int main() {
    char pressedKey;
    std::cout << "Press the key 'A' to continue: ";
    pressedKey = getchar();
    if(pressedKey == 'A') {
        std::cout << "Lets continuen";
    } else {
        return;
    }
}

或者在WindowsOS上,您可以在conio.h头文件中使用getch()例:

#include <iostream>
#include <conio.h>
int main() {
    std::cout << "Press any key to continue: ";
    int key = getch();
    std::cout << "You pressed: " << key << "n";
    if(key == 'k' || key == 'K') {
        std::cout << "You pressed k, i love letter k.n";
    }
}