Windows多平台下Python 2.7+PyHook按键读取异常求助
问题分析与解决方案
首先,问题的核心不是不同Windows平台对ASCII字母的解析有差异,而是你使用的PyHook库的event.Ascii属性在Windows 8.1/10这类较新系统中已经不再可靠了。
为什么会出现Ascii值为0的情况?
Windows 7之后的系统对键盘事件的处理更偏向Unicode机制,而PyHook的Ascii字段是基于旧的ASCII映射逻辑实现的——在新系统中,这个字段对于字母键经常会返回0,因为系统不再优先填充这个旧属性,转而使用Unicode属性来传递正确的字符信息。你看到的空白就是因为chr(0)是不可打印的空字符。
跨平台(Windows版本)适配的解决方案
直接改用event.Unicode属性来获取按键字符,同时优化你的文件写入逻辑(频繁打开关闭文件既低效又可能引发问题):
修改后的代码示例
import pyHook, pythoncom loc = 'c:\\Users\\Admin\\Desktop\\test.txt' def onkeyboardpress(event): # 直接获取Unicode字符,判断是否为大写字母 char = event.Unicode if char.isupper(): # 使用上下文管理器with自动处理文件打开/关闭,更安全高效 with open(loc, 'a', encoding='utf-8') as out: out.write(f'The letter {char} was pressed\n') return True hooks_manager = pyHook.HookManager() hooks_manager.KeyDown = onkeyboardpress hooks_manager.HookKeyboard() pythoncom.PumpMessages()
额外说明
- 如果需要同时处理小写字母,可以把判断条件改成
char.isalpha(),或者单独判断小写范围97 <= ord(char) <= 122。 - 加上
encoding='utf-8'参数可以确保文件写入时的编码一致性,避免不同系统下出现乱码问题。 - 用f-string(Python 3.6+支持)拼接字符串比传统的
+更简洁易读。
内容的提问来源于stack exchange,提问作者PeNpeL
相关产品推荐
相关产品推荐

