相关疑难解决方法(0)

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

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

  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;
}
Run Code Online (Sandbox Code Playgroud)

winapi keyboard-events visual-c++

5
推荐指数
1
解决办法
723
查看次数

Windows 为 ANSI 版本 WM_CHAR 生成 UTF8 序列?为什么我看不到它?

在今天(2023.01)的 MSDN https://learn.microsoft.com/en-us/windows/win32/inputdev/wm-char中,微软表示:

\n
\n

...否则(使用 ANSI 版本的 RegisterClass),系统在当前进程代码页中提供字符,可以在 Windows 版本 1903(2019 年 5 月更新)及更高版本中将其设置为 UTF-8 。

\n
\n

但是,我只是看不到 WM_CHAR 以 UTF8 序列呈现 Unicode 字符。我做错了吗,或者文档是错误/误导性的?

\n

我在Win10.21H2上进行了实验,使用的是Keyview2A.exe v1.8,它基于Charles Petzold在他的名著Programming Windows 5th-ed (1998)中的Keyview2演示程序。

\n

我正在尝试 Win10.21H2 。

\n

首先,非 UTF8ACP 情况表明 KeyviewA 工作正常。

\n

我尝试输入一个汉字\xe7\x94\xb5,即 U+7535,GBK 编码B5 E7

\n

非 UTF8APC,输入非 ASCII 字符

\n

非 UTF8APC,好的,我们在代码页 936 中得到 ANSI 序列

\n

其次,UTF8ACP 情况不会给出 KeyviewA UTF8 序列。

\n

我刚刚得到 0x3F(?),叹息!

\n

UTF8ACP,输入 Unicode 字符

\n

UTF8ACP,在 WM_CHAR 中看不到 UTF8 序列

\n

第三,SBCS中的那些角色呢?

\n

SBCS = 单字节字符集。\nDBCS = 双字节字符集。\nMBCS = …

unicode winapi

2
推荐指数
1
解决办法
375
查看次数

标签 统计

winapi ×2

keyboard-events ×1

unicode ×1

visual-c++ ×1