【问题标题】:GetKeyboardLayout() doesn't work properly in some casesGetKeyboardLayout() 在某些情况下无法正常工作
【发布时间】:2015-03-23 18:16:44
【问题描述】:

我正在编写应指示键盘布局的控制台应用程序。我使用GetForegroundWindow() 函数获取当前活动窗口,函数GetWindowThreadProcessId() 获取线程ID,最后,使用函数GetKeyboardLayout() 我得到键盘布局。除了某些情况外,Everyting 可以在我尝试的任何应用程序中正常工作:

  1. 当我将窗口切换到 cmd.exe 或任何其他控制台应用程序时,它显示默认布局,更改布局无效
  2. 在游戏中也是如此
  3. 同一进程的所有线程都具有相同的布局 [在 explorer.exe 上测试过(这让我很困惑,因为我认为布局是线程指定的)

请解释一下发生了什么。下面是我的测试代码

#include <Windows.h>
#include <iostream>

int main()
{
    while(8)
    {
        HWND  _curr_window = GetForegroundWindow();
        DWORD _curr_window_procces_id;
        DWORD _curr_window_thread_id = GetWindowThreadProcessId(_curr_window, &_curr_window_procces_id);
        std::cout << "Process ID is " << _curr_window_procces_id << " and Thread ID is " << _curr_window_thread_id << std::endl;
        HKL _key_locale = GetKeyboardLayout(_curr_window_thread_id);
        std::cout << "Keyboard layout is " << _key_locale << std::endl;
        Sleep(1000);
    }
    return 0;
}

【问题讨论】:

  • GetKeyboardLayout 适用于在 WINDOWS 子系统中运行的应用程序(它是一个 user32.dll 导出)。命令行应用程序在 CONSOLE 子系统中运行。
  • 可以为线程或整个过程更改键盘布局。
  • Microsoft 控制台存在问题github.com/Microsoft/console/issues/83

标签: winapi visual-c++ keyboard-events


【解决方案1】:

你的代码是对的,这是微软的问题。我在第三方 shell babun 中运行此代码并得到正确的结果。你可以试试这个shell,我认为它是Windows上最好的shell。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多