ctypes.windll.user32.GetKeyState无法识别键盘普通按键仅能识别鼠标按键问题
问题原因
你遇到的问题是两个错误导致的,和API本身限制无关:
- 键码类型使用错误:
ctypes.windll.user32.GetKeyState接收的参数是Windows虚拟键码,不是字符的ASCII编码。你用ord('a')得到的97是小写字母a的ASCII值,键盘A键对应的虚拟键码是0x41(十进制65,等于ord('A')的返回值),所有字母键的虚拟键码都统一对应大写字母的ASCII值,和当前大小写锁定状态无关。 - 返回值判断逻辑错误:
GetKeyState返回的是16位有符号整数,按键按下时最高位为1,正确的判断方式是和0x8000做按位与运算,而不是判断返回值大于1。
修正后代码
import ctypes def a_pressed(): return ctypes.windll.user32.GetKeyState(ord('A')) & 0x8000 != 0 while True: if a_pressed(): print('a is pressed')
补充说明
- 检测其他字母键时,直接传入对应大写字母的
ord()返回值即可,比如B键对应ord('B') - 检测功能键、方向键、小键盘按键等特殊按键时,需要查询Windows虚拟键码表对应值
内容的提问来源于stack exchange,提问作者Bituvo
相关产品推荐
相关产品推荐

