如何确定C++中的按键
How do determine key presses in C++
我正在开发一个要在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";
}
}
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何在C++中确定文本文件中的元素是字符还是数字
- Python中的for循环与C++有何不同
- 在clang++预处理器中确定gcc工具链版本
- 不确定要在我的main中放入什么才能使我的代码正常工作
- C++setiosflags函数操纵器-未确定的缩进
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 如何使用url确定网站协议
- 通过构造函数动态确定类实现
- 遍历并行数组以确定C++中的最大数字
- C++如果必须在编译时确定大小,std::array 有什么意义?
- 使用不变量来确定二分搜索中的边界条件
- 无论如何,我可以确定构造函数是否存在吗?
- compare_exchange C++函数如何确定竞争条件?
- 如何使用 do while 循环确定最高值和最低值
- 如何确定哪个标头调用 c++ 中的另一个标头
- 在C++中释放内存期间,迭代器与指针有何不同
- C++ Chrono 确定一天是否是周末?
- 什么是C++中的不确定行为?它与未定义的行为有何不同