Tag: 键盘

SDL_GetKeyboardState无法正常工作

我正在尝试为SDL 2的游戏制作一个控制器(不想在gamedev上询问,因为它不是直接的游戏问题)我使用SDL_GetKeyboardEvent来查看导航箭头是否被按下但是它显然不起作用,如果按下其中一个键,它应该打印一个值1或-1但它不会打印0即使我按住键几秒钟,它就像它没有检测到键被压了。 我搜索了整个互联网,这就是他们如何做到的,但它对我不起作用。 #define SDL_MAIN_HANDLED #include #include “SDL.h” /* I’ll add some code later so something that isn’t used might be initialized */ int main (void) { int a = 1; int x; int z; SDL_Event quit; const Uint8 *keys = SDL_GetKeyboardState(NULL); SDL_Init(SDL_INIT_VIDEO); while(a) { SDL_PollEvent(&quit); if(quit.type == SDL_QUIT) a = 0; if(keys[SDL_SCANCODE_UP]) z = […]

替代fscanf()/ vscanf()函数系列以使用替代validation密钥或如何创建自定义语言布局?

我更喜欢C语言。我知道从stdin设置变量的唯一方法是使用fscanf() / vscanf()函数系列。 DOS操作系统正在嵌入式市场中复苏。 我使用的设备在程序上与DOS兼容,并使用具有80286指令集的NEC V30Mx。 问题是内置键盘没有输入键,而是使用输入0x1C00键代码的EXE键( Alt输入 ) 。 所以当我写这样的程序时: #include #include #include int main(void) { int res, number = 0; printf(“int value?”); res = scanf(“%d”, &number); printf(“The value is %d”, number); return; } 调用scanf()并在屏幕上显示“ int value? ”。 我可以写数字和超级字母。 但我无法validation输出,因为0x1C0D键代码没有任何特征,EXE键使用不同的键码。 当然C不知道键盘,但C标准库二进制文件寻找输入\n的0x1C0D键代码 。 那么是fscanf() / vscanf()函数系列的替代品,它是C标准库的一部分吗? 更新: 我认为dos下的大多数C标准库都使用软件实现来实现这一点。 我看到DOS调用读取文件,当然,使用数字0导致从标准输入读取。 所以我组装了这个例子 ,将它加载到计算器上,发现自己很惊讶制造商首选处理它的内置软件中的问题,而不是修复操作系统… :- ((我得到了相同的先前结果) 更新 我没想过但是由于评论,我忘了键盘语言做重键代码重映射。 […]

C – 直接从键盘缓冲区读取

这是C编程语言中的一个问题。 如何直接读取键盘缓冲区中的数据? 我想直接访问数据并将其存储在变量中。 变量应该是什么数据类型? 我需要它用于我们研究所正在开发的操作系统。 它被称为ICS-OS,我不太清楚具体细节。 它运行在x86,32位机器上(我们在Linux机器上的QEMU上运行它)。 以下是Google Code http://code.google.com/p/ics-os/的链接。 我希望这些信息足够充分。 操作系统不支持conio.h库,因此kbhit不是一个选项。

为什么`ioctl(fd,EVIOCGRAB,1)`有时会导致密钥垃圾邮件?

我正在尝试编写自己的“键盘驱动程序”(没有实际编写内核模块),通过抓取键盘,我认为是userland中最低级别的抽象: /dev/input/event* 。 如果您将ioctl(fd, EVIOCGRAB, UNGRAB)的第一个更改更改为ioctl(fd, EVIOCGRAB, GRAB)以下代码执行此操作。 // gcc main.c -o main #include #include #include #include #include #include #define EXIT_KEY KEY_ESC #define UNGRAB 0 #define GRAB 1 const char* kbd_device = “/dev/input/event4”; // ———————————————————————————————— int main(void){ int fd = open(kbd_device, O_RDONLY); if(fd == -1){ printf(“Cannot open %s. %s.\n”, kbd_device, strerror(errno)); return -1; } if(ioctl(fd, […]

SDL物理密钥代码和SDL虚拟密钥代码之间有什么区别?

struct SDL_Keysym具有SDL_Scancode和SDL_Keycode成员。 它们之间有什么区别? 文档并没有真正为我清除它。 我试过两个,他们似乎做同样的事情。

如何区分左右键(CTRL和ALT)?

我开始利用Win32的原始输入function来检测键盘上的所有键。 到目前为止,一切都很好! 我可以区分顶行的数字和右侧键盘的数字。 我甚至可以在左右键之间进行检测。 但是,control和alt键不会返回唯一的扫描码。 控制键返回29,并且alt键返回56。 检查这些键上的键状态的流行方法是GetAsyncKeyState 。 我已经使用VK_LCONTROL和VK_RCONTROL测试了该function,但它可以工作,但这只能帮助我捕获按键事件。 我真的希望能够捕获关键事件。 很明显,API在某种程度上意识到正在按下哪个键; 我如何获得这些信息? 我目前正在从RAWKEYBOARD结构的MakeCode字段中提取扫描代码。 这给了我关于除CTRL和ALT之外的每个键(及其左/右对齐)的信息。 我将如何捕获关键事件(并知道它是左/右)? 是否可以只使用RAWKEYBOARD结构? 或者我是否需要制定某种解决方法?

如何禁用Alt键的正常行为?

通常,Alt键会在Windows中打开菜单。 我需要禁用它,因为我的应用程序需要Alt键。 (它是旧计算机的模拟器,所以我需要模仿它的行为。)我在纯Windows API中编写它,所以我希望必须有一些消息发送,需要被禁用,丢弃或忽略。 Alt + Tab没有问题,以及其他系统键和组合键,我只需要在打开菜单时忽略Alt。 (我的应用程序使用DirectInput读取键,因此它运行良好。我只需要禁用使用Alt键打开菜单的function。我将使用鼠标打开菜单。)

使用Turbo C ++ 3.0处理键盘中断

我有一个项目。 这是一个简单的游戏,“Falling Blocks”。 游戏区域被视为网格,其大小为20×20。 屏幕顶部会出现下降的块,底部会有一个英雄,他们会射击这些块。 游戏的目标是在他们达到底线之前拍摄块。 他总是处于底线。 每当用户按下键盘上的空格键时,我将生成一个子弹,并且英雄用左右箭头键在底线上移动。 我不知道用Turbo C ++ 3.0处理这些键盘中断。 禁止使用“dos.h”和“int 21H”。 你能给我一些关于这些项目的提示吗? 编辑:我发现了这些信息,但我无法理解如何实现它: 当在键盘上按下键时,产生中断以及名为“生成代码”的扫描代码,并且当释放该键时,键盘控制器产生“中断代码”。 在PC上,键盘由芯片控制并分配给端口号60h和61h。 在键盘上按下键时,扫描值将在60h时进行注册。 您可以使用以下命令获取此扫描代码:在al,60h获取扫描代码后,您必须使用以下命令重置键盘编程61h芯片的命令寄存器:al,61h或al,82h out 61h ,al和al,7fh out 61h,al在每个中断服务程序结束时,清除PIC服务位,发送中断结束(EOI)命令,20h到地址20h的PIC端口。 mov al,20h out 20h,al

Win32确定何时连接/断开键盘

我正在尝试确定键盘何时连接或断开连接。 我尝试了以下策略: RegisterDeviceNotification 如何在DirectInput中确定键盘断开连接时,建议使用如MSDN上所述的RegisterDeviceNotifaction。 当我尝试这个时,我在窗口回调中得到了DB_DEVNODES_CHANGED事件,它没有提供其他信息(只是一些未知设备已经改变了连接状态)。 我为注册尝试了各种GUID: 4D36E96B-E325-11CE-BFC1-08002BE10318 (几个网站说这是键盘的类guid)和从IDirectInput8::EnumDevices(DI8DEVCLASS_KEYBOARD, …, DIEDFL_ATTACHEDONLY)检索的IDirectInput8::EnumDevices(DI8DEVCLASS_KEYBOARD, …, DIEDFL_ATTACHEDONLY) 。 但我仍然只得到DB_DEVNODES_CHANGED事件。 IDirectInput8 :: EnumDevices 每次调用IDirectInput8::EnumDevices(DI8DEVCLASS_KEYBOARD, …, DIEDFL_ATTACHEDONLY)都应该只枚举附加的设备。 但是,当我断开键盘的连接时, EnumDevices仍会枚举EnumDevices 。 当我对我的游戏控制器(类型为DI8DEVCLASS_GAMECTRL )执行相同操作时,控制器仅在连接时枚举,允许我确定其连接状态。 其他function 我试过了: IDirectInput8::GetDeviceStatus IDirectInputDevice8::GetCapabilities IDirectInputDevice8::GetDeviceInfo IDirectInputDevice8::GetDeviceState IDirectInputDevice8::Poll 所有function都成功,并且无法确定键盘是否已连接。 我也看过MSDN的键盘部分 ,但无济于事。 问题 成功完成此任务的任何人都可以证实我采取了正确的方法吗? 我还有其他function或API吗? 任何提供示例的网站(我用google搜索失败了)? 为什么EnumDevices适用于我的控制器而不是我的键盘? 我如何让它适用于我的键盘?

当我按下键盘上的键时,如何防止重复的字符

我试图学习如何防止键盘发送多个字符到屏幕和DOS下扫描。 我正在使用带有内联汇编的Turbo-C。 如果键盘上输入的字符是: 嗯嗯嗯嗯 在控制台上看到并由scanf处理的字符将是: 我的名字是Haim 基本输出来自C中的代码,我不允许触摸。 我必须实现eliminate_multiple_press和uneliminate_multiple_press而不触及uneliminate_multiple_press的代码。 我到目前为止写的Turbo-C代码是: #include #include #include volatile char key; volatile int i=0; void interrupt (*Int9save) (void); void interrupt kill_multiple_press() { asm{ MOV AL, 0 MOV AH,1 INT 16h PUSHF CALL DWORD PTR Int9save MOV AX,0 } asm{ JZ notSet MOV key, AL MOV AH, 04H INT 16H } notSet: […]