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

如何获取键盘布局的阅读方向?WinAPI实现方案咨询

解决方案

可以通过WinAPI的HKLToLCID+GetLocaleInfoEx组合实现需求,无需硬编码语言列表:

1. 从HKL转换为LCID

先调用GetKeyboardLayout获取当前活动窗口的键盘布局句柄,再通过HKLToLCID将其转换为区域设置ID(LCID):

// 获取当前前台窗口的线程ID对应的键盘布局
HKL hkl = GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), nullptr));
// 将HKL转换为LCID(第二个参数传0表示忽略临时布局的标志位,直接转换)
LCID lcid = HKLToLCID(hkl, 0);

2. 获取区域设置的阅读方向

使用GetLocaleInfoEx函数,传入LOCALE_IREADINGLAYOUT参数,直接读取该区域设置的阅读方向:

  • 返回值0:表示从左到右(LTR)
  • 返回值1:表示从右到左(RTL)
DWORD readingDirection = 0;
// 调用GetLocaleInfoEx获取阅读方向
GetLocaleInfoEx(
    reinterpret_cast<LPCWSTR>(lcid),
    LOCALE_IREADINGLAYOUT,
    reinterpret_cast<LPWSTR>(&readingDirection),
    sizeof(readingDirection) / sizeof(WCHAR)
);

3. 处理Windows 8+的临时键盘布局

对于LOCALE_TRANSIENT_KEYBOARD1和LOCALE_TRANSIENT_KEYBOARD2这类临时布局,HKLToLCID会自动转换为对应的临时LCID,后续调用GetLocaleInfoEx仍能正常获取其阅读方向,无需额外逻辑处理。

4. 空布局下的光标定位逻辑

当文本布局为空时,根据上述获取的readingDirection值设置光标位置:

  • 若为1(RTL):将光标置于编辑区域的最右侧
  • 若为0(LTR):将光标置于编辑区域的最左侧

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:45:22