Windows虚拟键代码
Windows virtual key codes
我如何实现像 std::string VirtualKeyCodeToStdString(UCHAR key)
这样的函数返回虚拟键描述?
示例:输入为 VK_CAPITAL
,返回值是 std::string("Caps Lock")
将VK代码转换为键文本表示的一种简单方法是:
- 使用
MapVirtualKey
将VK代码转换为扫描代码。 - 做一点转变以将该值转换为长时间,其中位16-23是扫描代码
- 使用
GetKeyNameText
获取键的名称。
例如:
WCHAR name[1024];
UINT scanCode = MapVirtualKeyW(VK_CAPITAL, MAPVK_VK_TO_VSC);
LONG lParamValue = (scanCode << 16);
int result = GetKeyNameTextW(lParamValue, name, 1024);
if (result > 0)
{
std::wcout << name << endl; // Output: Caps Lock
}
如果您是为了响应WM_KEYDOWN
或通过LPARAM
中传递扫描代码的其他消息而执行此操作,则可以跳过前两个步骤,因为这些步骤只是在那里将VK代码按摩到GetKeyNameText
的正确格式化输入中。有关GetKeyNameText
的功能和第一个参数的格式的更多信息,请参见MSDN
注意:我使用了API调用上的W变体,因此您实际上需要使用std::wstring
传递密钥名称,但是您可以轻松地更改它以使用A版本。另外,如果您需要通过键盘布局以获取正确的扫描代码,则可以使用MapVirtualKeyEx
。
没有完整的答案。谢谢大家的帮助。经过更多的研究,我编写了将virtualKey
转换为std::string
描述的完整功能。
* STD :: BASIC_STRING&lt;tchar>版本: *
typedef std::basic_string<TCHAR> tstring;
tstring VirtualKeyCodeToString(UCHAR virtualKey)
{
UINT scanCode = MapVirtualKey(virtualKey, MAPVK_VK_TO_VSC);
TCHAR szName[128];
int result = 0;
switch (virtualKey)
{
case VK_LEFT: case VK_UP: case VK_RIGHT: case VK_DOWN:
case VK_RCONTROL: case VK_RMENU:
case VK_LWIN: case VK_RWIN: case VK_APPS:
case VK_PRIOR: case VK_NEXT:
case VK_END: case VK_HOME:
case VK_INSERT: case VK_DELETE:
case VK_DIVIDE:
case VK_NUMLOCK:
scanCode |= KF_EXTENDED;
default:
result = GetKeyNameText(scanCode << 16, szName, 128);
}
if(result == 0)
throw std::system_error(std::error_code(GetLastError(), std::system_category()),
"WinAPI Error occured.");
return szName;
}
std :: String版本:
std::string VirtualKeyCodeToString(UCHAR virtualKey)
{
UINT scanCode = MapVirtualKey(virtualKey, MAPVK_VK_TO_VSC);
CHAR szName[128];
int result = 0;
switch (virtualKey)
{
case VK_LEFT: case VK_UP: case VK_RIGHT: case VK_DOWN:
case VK_RCONTROL: case VK_RMENU:
case VK_LWIN: case VK_RWIN: case VK_APPS:
case VK_PRIOR: case VK_NEXT:
case VK_END: case VK_HOME:
case VK_INSERT: case VK_DELETE:
case VK_DIVIDE:
case VK_NUMLOCK:
scanCode |= KF_EXTENDED;
default:
result = GetKeyNameTextA(scanCode << 16, szName, 128);
}
if(result == 0)
throw std::system_error(std::error_code(GetLastError(), std::system_category()),
"WinAPI Error occured.");
return szName;
}
相关文章:
- 删除C++继承中虚拟类成员的代码重复
- 我们可以在层次结构中创建多个纯虚拟接口及其实现而不会代码爆炸吗?
- 添加虚拟析构函数会使代码大小膨胀
- 如何在 Windows API 中检测带有虚拟代码的非字母?
- C++端口监视器 (mfilemon.dll) RDP 虚拟通道代码未执行
- 代码在虚拟函数和继承方面未按预期工作
- vptr 和 vtable 在下面的虚拟相关代码中是如何工作的?
- 需要WXLISTCTRL的代码更改为虚拟样式WXListCtrl的工作代码
- 如何在没有大量代码的情况下将类 A 中的纯虚拟方法绑定到两者的子类中 B 类的方法?
- 特殊字符的虚拟键代码
- 在代码中获取虚拟值C++而不是预期值
- 仅仅为了代码重用而不必要地使用虚拟函数
- 如何将x64机器代码写入虚拟内存并在C++中为Windows执行
- Windows虚拟键代码
- 如何将UCHAR虚拟密钥代码转换为std::string
- 如何在 CLANG 中创建用于代码完成的虚拟文件
- 虚拟HID(人接口设备)的代码示例
- 我已经将虚拟内存设置为20GB,但由于内存不足,代码仍然无法工作
- 有没有任何方法可以从C++中的char中获取虚拟密钥代码
- 在C++代码生成器中模拟 C#"new"(隐藏虚拟方法)