一、问题描述
1.1 需求说明
我们准备使用Pygame开发一个键盘输入测试程序,需要确保输入时窗口始终处于英文输入模式,也就是禁止中文输入;
1.2 现象描述
控制台种显示,程序在初始化时,会有两次IMM状态切换操作,相关信息如下:
pygame 2.6.1 (SDL 2.28.4, Python 3.13.0)
Hello from the pygame community. https://www.pygame.org/contribute.html
2025-01-27 01:49:53.843 | DEBUG | __main__:set_conversion_status:63 - 当前转换状态: conversion=1, sentence=8
2025-01-27 01:49:53.844 | INFO | __main__:set_conversion_status:68 - 成功设置转换状态: window_focus
2025-01-27 01:49:53.847 | DEBUG | __main__:set_conversion_status:63 - 当前转换状态: conversion=1025, sentence=0
2025-01-27 01:49:53.848 | INFO | __main__:set_conversion_status:68 - 成功设置转换状态: loop6
Process finished with exit code 0
具体表现为:
- 第一次:窗口获得焦点时(ACTIVEEVENT事件触发),conversion值为1
- 第二次:在主循环早期(约第6次循环),conversion值变为1025
1.3 现象特征
- 重复性:该现象可稳定复现
- 时序性:两次切换有固定的时间间隔
- 不受用户操作影响:即使用户未进行任何输入,该现象仍会发生
1.4 问题影响
- 性能影响:额外的IME状态切换操作
- 日志干扰:产生额外的状态切换日志
- 开发困扰:可能被误认为是代码缺陷
二、测试环境
- 操作系统:Windows 10 家庭中文版 22H2
- Python版本:3.13.0
- Pygame版本:2.6.1
- SDL版本:2.28.4
- 输入法:中文微软输入法
三、不可避免性证明
3.1 系统机制层面
- 状态保持机制
- Windows为每个窗口维护独立的IME状态
- 状态信息存储在系统级别
- 应用程序无法禁用此机制
- 自动恢复逻辑
- 系统设计用于保证用户体验一致性
- 基于Windows核心服务实现
- 属于操作系统基础功能
3.2 技术限制分析
API限制
- ImmGetContext/ImmSetConversionStatus是异步操作
- 无法阻止系统级IME状态恢复
- 没有提供禁用自动恢复的接口