【问题标题】:Keyboard layout switch on the fly in C++ using GetKeyName() function in windows使用 Windows 中的 GetKeyName() 函数在 C++ 中即时切换键盘布局
【发布时间】:2018-12-12 11:43:14
【问题描述】:

我正在尝试获取各种语言的特定扫描码的键值 按以下方式输入
布局:美国英语(美国键盘) 16 - 问 17 - 西 18 - 乙 19 - 右 20 - 吨 21 - 是的 布局:法语(法语键盘) 16 - 一个 17 - Z 18 - 乙 19 - 右 20 - 吨 21 - 是的 为此,我使用以下代码:

#include "pch.h"
#include "iostream"
#include <windows.h>

using namespace std;
int main()
{
    int scancode[6] = { 16,17,18,19,20,21};
    int bufferLength = 10;
    char buffer[10] ;
    while (1)
    {
        int i = 0;
        for (i = 0; i < 6 ; i++)
        {
            unsigned int extended = scancode[i] & 0xffff00;
            unsigned int lParam = 0;

            if (extended) 
            {

                if (extended == 0xE11D00)
                {
                    lParam = 0x45 << 16;
                }
                else
                {
                    lParam = (0x100 | (scancode[i] & 0xff)) << 16;
                }

            }
            else {

                lParam = scancode[i] << 16;

                if (scancode[i] == 0x45) 
                {
                    lParam |= (0x1 << 24);
                }
            }
            GetKeyNameTextA(lParam, buffer, bufferLength);
            printf("%s \n", buffer);

        }

    }
    return 0;
}

此代码为我提供了本地化的键值,但如果我在运行时更改布局,键值不会更改。它们与以前一样,要获得更改的值,我必须再次运行它。任何人都可以建议我修复它吗? 还建议是否有其他方法可以实现这一目标..

【问题讨论】:

  • 这段代码没有多大意义。 GetKeyNameTextA 获取当前 ANSI 设置中的文本,这是一个全局设置,在没有重新启动或注销/登录的情况下无法更改。更改键盘布局将无效。解释你的目标,以及你最终要完成的目标。
  • 我的最终目标是在我的应用程序中提供动态键盘布局切换,如果用户选择不同的布局,他应该获得适当的值,例如在法语布局上应该显示键 A 而不是 Q (在标准英文键盘上)。同样,我必须为 14 种不同的布局提供支持。

标签: c++ windows c++11 localization keyboard-layout


【解决方案1】:

使用LoadKeyboardLayout 并发送WM_INPUTLANGCHANGEREQUEST 更改键盘布局如下:

#include <iostream>
#include <string>
#include <windows.h>

int main()
{
    HKL hkl = LoadKeyboardLayout(L"0000080c", KLF_ACTIVATE);
    PostMessage(GetConsoleWindow(), WM_INPUTLANGCHANGEREQUEST, 0, (LPARAM)hkl);
    std::string str;
    while(std::cin >> str)
        if(str == "0")
            break;
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多