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

标签 winapi visual-c++ keyboard-events

我正在编写应指示键盘布局的控制台应用程序。我正在使用 GetForegroundWindow()获取当前事件窗口的函数,函数GetWindowThreadProcessId()获取线程 id,最后,使用函数 GetKeyboardLayout()我得到键盘布局。除了某些情况外,Everyting 适用于我尝试的任何应用程序:

  • 当我将窗口切换到 cmd.exe 或任何其他控制台应用程序时,它显示默认布局,更改布局无效
  • 在游戏中也是一样的情况
  • 同一进程的所有线程都具有相同的布局 [在 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;
    }
    

    最佳答案

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

    关于winapi - GetKeyboardLayout() 在某些情况下无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29217501/

    相关文章:

    C++ 语法错误 - 找不到标识符

    javascript - 编写内联 javascript if 语句 onclick 或任何其他 JS 事件?

    wpf - 为什么 KeyUp 和 KeyDown 事件变慢?

    cocoa - CGEventPost - 按住一个键(Shift)

    c++ - 枚举所有注册表项的最有效方法

    c++ - ShellExecute 获取打开文件夹的权限

    c++ - 具有多个相同项目的组合框中的无效选择

    visual-c++ - 构建使用强类型数据集的 C++/CLI 项目时警告 C4564

    c++ - 如何使用 WaitForMultipleObjects 来平衡竞争工作?

    c - 如何检查与网络驱动器的连接?