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

如何用Python获取当前活动窗口的输入法语言状态(跨窗口适用)

刚好我之前做过类似的需求——要监控系统全局的输入法状态,而不是只在自己的Python程序窗口里生效。针对Windows平台(毕竟韩语输入法在Windows里是最常用的场景),我们可以直接调用系统的Win32原生API来实现,因为输入法的布局状态是和当前活动窗口的线程绑定的,下面是具体的实现思路和可运行的代码:

核心实现思路

要获取任意活动窗口的输入法状态,需要走以下几步:

  • 第一步:拿到当前前台活动窗口的句柄(不管是不是Python程序的窗口)
  • 第二步:根据窗口句柄获取它所属的线程ID
  • 第三步:通过线程ID获取该线程正在使用的键盘布局ID(KLID)
  • 第四步:解析KLID对应的语言编码,判断是韩语还是英语
完整代码实现
import ctypes
from ctypes import wintypes
import time

# 加载Windows系统的user32.dll,这是窗口和输入法相关API的核心库
user32 = ctypes.WinDLL('user32', use_last_error=True)

# 给要调用的Win32 API定义参数和返回值类型,确保调用时类型匹配
user32.GetForegroundWindow.restype = wintypes.HWND
user32.GetWindowThreadProcessId.argtypes = (wintypes.HWND, wintypes.LPDWORD)
user32.GetWindowThreadProcessId.restype = wintypes.DWORD
user32.GetKeyboardLayout.argtypes = (wintypes.DWORD,)
user32.GetKeyboardLayout.restype = wintypes.HKL

def get_current_input_language():
    # 获取当前最前端的活动窗口句柄
    hwnd = user32.GetForegroundWindow()
    if not hwnd:
        return None
    
    # 获取窗口对应的线程ID(输入法状态和线程绑定,不是进程)
    thread_id = user32.GetWindowThreadProcessId(hwnd, None)
    if not thread_id:
        return None
    
    # 获取该线程的键盘布局ID(HKL)
    hkl = user32.GetKeyboardLayout(thread_id)
    # HKL的高16位是语言代码标识符(LCID),我们只需要这部分
    lcid = hkl >> 16
    
    # 映射常见的LCID到语言名称,可根据需求扩展
    language_map = {
        0x0409: "English",  # 英语(美国)
        0x0412: "Korean"    # 韩语
    }
    
    return language_map.get(lcid, f"Unknown (LCID: {lcid:04X})")

# 测试:实时监控输入法状态
print("正在监控输入法状态(按Ctrl+C停止)...")
try:
    while True:
        current_lang = get_current_input_language()
        print(f"当前输入法语言: {current_lang}", end="\r")
        time.sleep(0.5)
except KeyboardInterrupt:
    print("\n已停止监控。")
关键细节说明
  • 为什么用Win32 API?:Python本身没有内置的全局输入法状态获取能力,而Windows系统的user32.dll提供了直接访问窗口和线程级输入法状态的接口,这是最可靠的方式。
  • LCID的含义:LCID(Language Code Identifier)是Windows用来标识语言的编码,英语(美国)固定是0x0409,韩语是0x0412,如果需要支持更多语言,直接在language_map里添加对应LCID即可。
  • 线程绑定的原因:Windows里每个线程可以单独设置输入法布局,所以必须通过窗口对应的线程ID来获取,而不是进程ID。
注意事项
  • 这个方案仅适用于Windows平台, macOS或Linux需要用对应系统的API实现(比如macOS用Carbon框架,Linux用ibus或fcitx的接口)。
  • 少数系统级特殊窗口可能无法获取到状态,但普通应用程序窗口(比如记事本、浏览器、Office软件等)都能正常识别。
  • 不需要额外安装第三方库,只依赖Python自带的ctypes模块。

内容的提问来源于stack exchange,提问作者이주원

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:27:39