You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

额外说明

  1. 如果需要同时处理小写字母,可以把判断条件改成char.isalpha(),或者单独判断小写范围97 <= ord(char) <= 122。
  2. 加上encoding='utf-8'参数可以确保文件写入时的编码一致性,避免不同系统下出现乱码问题。
  3. 用f-string(Python 3.6+支持)拼接字符串比传统的+更简洁易读。

内容的提问来源于stack exchange,提问作者PeNpeL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:10:50