在某些情况下,GetKeyboardLayout()无法正常工作

时间:2015-03-23 18:16:44

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

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

  1. 当我将窗口切换到cmd.exe或任何其他控制台应用程序时,它显示默认布局,更改布局无效
  2. 在游戏中情况相同
  3. 同一进程的所有线程都有相同的布局[在explorer.exe上测试过(这让我很困惑,因为我认为布局是线程指定的)
  4. 请解释一下发生了什么。以下是我的测试代码

    #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;
    }
    

1 个答案:

答案 0 :(得分:0)

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