首页 > 解决方案 > WndProc 获取键入的字符

问题描述

我需要帮助,基本上我想要做的是创建文本输入字段,我需要让我的程序知道我何时按下键盘上的任何键,然后获取键入的字符并将键入的字符添加到现有的 std::string 变量

我尝试了很多搜索,但我没有找到任何解决我的问题的方法我需要输入与我在当前键盘语言(如(č'ˇ°)等键盘上输入的字符相同)...

std::string text;
MSG msg;

LRESULT CALLBACK Hooked_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_LBUTTONDOWN:
        g_Menu.keys[VK_LBUTTON] = true;
        break;
    case WM_LBUTTONUP:
        g_Menu.keys[VK_LBUTTON] = false;
        break;
    case WM_RBUTTONDOWN:
        g_Menu.keys[VK_RBUTTON] = true;
        break;
    case WM_RBUTTONUP:
        g_Menu.keys[VK_RBUTTON] = false;
        break;
    case WM_KEYDOWN:
        g_Menu.keys[wParam] = true;
        break;
    case WM_KEYUP:
        g_Menu.keys[wParam] = false;
        break;
    case WM_MOUSEWHEEL:
        if ((short)HIWORD(wParam) < 0)
        {
            cvar.m_Wheel_up = false;
            cvar.m_Wheel_down = true;
        }
        else
        {
            cvar.m_Wheel_down = false;
            cvar.m_Wheel_up = true;
        }
        break;

    default: break;
    }
}

标签: winapi

解决方案


您可以通过 获取当前的键盘布局GetKeyboardLayout,然后使用ToUnicodeEx将输入的字符转换为对应的 Unicode 字符。

这是实现的代码片段:

HHOOK _k_hook;
std::wstring text;
LRESULT __stdcall k_Callback1(int nCode, WPARAM wParam, LPARAM lParam)
{
    PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT)lParam;

    //a key was pressed
    if (wParam == WM_KEYDOWN && nCode == HC_ACTION)
    {
        TCHAR buffer[1024];
        HKL hkl = GetKeyboardLayout(GetCurrentThreadId());  //choose current keyboard layout
        BYTE uKeyboardState[256]{};
        ToUnicodeEx(key->vkCode, key->scanCode, uKeyboardState, buffer, 1024, 0, hkl);
        text += buffer;
        wcout << text << endl;;
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

推荐阅读