SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

处理键盘(keyboard)

查看数: 4190 | 评论数: 2 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2017-9-29 20:25

正文摘要:

一楼:键盘事件:SDL_KeyboardEvent 二楼:Rose处理键盘事件

回复

ancientcc 发表于 2017-9-29 20:26:08

键盘事件:SDL_KeyboardEvent

本帖最后由 ancientcc 于 2017-9-29 20:27 编辑

字段名C类型说明
typeUint32键盘事件类型SDL_KEYDOWN, SDL_KEYUP
windowIDUint32键盘挂接到焦点窗口焦点窗口,0
stateUint8按键状态SDL_PRESSED,SDL_RELEASED
repeatUint8此次是否是重复触发(注1)SDL_PRESSED时,或是1或是0  SDL_RELEASED时肯定是0
keysym.scancode 此次事件涉及到的控制符
keysym.mod 此次消息之后的控制符状态(注2)
keysym.sym oem码转换来的SDL自定按键码值(注3)
keysym.unicode



1:按下一个按键时系统会触发两个消息,一个DOWN一个UP,具体到Windows是WM_KEYDOWN、WM_KEYUP。通常情况下WM_KEYDOWN、WM_KEYUP是成对出现的,但有时会出现同一个键多个WM_KEYDOWN,这时第二后或之后的WM_KEYDOWN中的repeat就会被置为1。对于如何判断repeat是什么值,有些系统有API支持,像Window上的lParam的bit30,但SDL判断repeat没使用系统API,而是借用SDL_Keyboard::keystate字段。以下是大概逻辑。
按键按下时(state = SDL_PRESSED)
  1. repeat = (state && keyboard->keystate[scancode]);
  2. keyboard->keystate[scancode] = state; // 置标志
复制代码
按键松开时(state = SDL_RELEASED)
  1. keyboard->keystate[scancode] = state; // 清标志
复制代码
2:支持的控制符
名称SDL_Keymod(mod字段)SDL自定义码(scancode字段)
数字控制键KMOD_NUMSDL_SCANCODE_NUMLOCKCLEAR
CAPSKMOD_CAPSSDL_SCANCODE_CAPS
左侧CTRLKMOD_LCTRLSDL_SCANCODE_LCTRL
右侧CTRLKMOD_RCTRLSDL_SCANCODE_RCTRL
左侧SHIFTKMOD_LSHIFTSDL_SCANCODE_LSHIFT
右侧SHIFTKMOD_RSHIFTSDL_SCANCODE_RSHIFT
左侧ALTKMOD_LALTSDL_SCANCODE_LALT
右侧ALTKMOD_RALTSDL_SCANCODE_RALT
左侧GUIKMOD_LGUISDL_SCANCODE_LGUI
右侧GUIKMOD_RGUISDL_SCANCODE_RGUI
MODEKMOD_MODESDL_SCANCODE_MODE

scancode和mod关系。scancode来自系统API,mod则根据scancode和当前控制键状态计算出的一个值。scancode、mod使用时候。
  • scancode表示“此次事件涉及到的控制符”,当希望判断此次按下/弹开涉及到哪些控制任,使用这个字段。
  • mod表示“此次消息之后的控制符状态”,当希望判断此次按下/弹开后控制符是什么状态,使用这个字段。


3:oem码如何转换到SDL自定码
说是SDL自定码,但它其实并不是SDL自定义的,它摘自http://www.usb.org/developers/devclass_docs/Hut1_12.pdf

转换操作就是通过一个数组:windows_scancode_table。组数索引就是oem码,像常见就是ascii,组就是SDL自定义码。

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 04:16 , Processed in 0.053365 second(s), 24 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表