winapi - 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;
}
}
解决方案
您可以通过 获取当前的键盘布局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);
}
推荐阅读
- reactjs - Typescript 声明在不同的依赖中必须有相同的变量问题
- ios - 我应该/必须为数字票务市场使用什么支付网关?
- python - Linux Path 环境变量——以正确的方式添加带空格的路径
- java - VBox 的拖放功能
- python-3.x - 将变量字典导出到 csv 的熊猫有空行
- angular - 如何在 SharePoint 2013 中部署 Angular 应用程序
- python - Tensorflow Dataset 是否会在 epoch 之间使用数据集转换在 shuffle 后进行 shuffle?
- spring - 如何使用 SpEL 避免空指针异常
- javascript - 使用 Firebase 云函数 onCreate 监听器设置自定义声明后如何通知前端需要刷新
- c# - 如何从 html 页面调用 c# 一键安装文件?