相关疑难解决方法(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
查看次数

其他进程的GetKeyboardLayoutName?

基本上,我想做的是让 GetKeyboardLayoutName 返回其他进程的键盘 ID (KLID)。默认情况下,它仅重新运行我的应用程序窗口的键盘 ID。我也尝试了 GetKeyboardLayout 但不幸的是它返回了 HKL(它接受其他窗口的 hwnd)。

或者,如果有一种方法可以将 HKL 转换为 KLID,那也很好,但我怀疑是否存在这样的事情。

那么,我怎样才能实现这一目标呢?我希望能够使用获得的KLID作为LoadKeyboardLayout函数的参数。

c# windows keyboard winapi unmanaged

3
推荐指数
1
解决办法
3901
查看次数

标签 统计

winapi ×2

c# ×1

keyboard ×1

keyboard-events ×1

unmanaged ×1

visual-c++ ×1

windows ×1