我该如何实现一个类似于std::string VirtualKeyCodeToStdString(UCHAR key)
的函数,该函数返回虚拟键的描述信息?
例如:输入为VK_CAPITAL
,返回值为std::string("Caps Lock")
我该如何实现一个类似于std::string VirtualKeyCodeToStdString(UCHAR key)
的函数,该函数返回虚拟键的描述信息?
例如:输入为VK_CAPITAL
,返回值为std::string("Caps Lock")
将VK码转换为键的文本表示的简单方法是:
MapVirtualKey
将VK码转换为扫描码。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
的格式化输入。有关该函数以及第一个参数的格式的更多信息,请参见MSDN文档。std::wstring
来传递键名,但是您可以轻松更改为使用A版本。另外,如果您需要传递键盘布局以获取正确的扫描码,则可以使用MapVirtualKeyEx
。没有全面的答案。感谢大家的帮助。在更多的研究之后,我编写了完整的函数,将 virtualKey
转换为 std::string
描述。
* std::basic_string < 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;
}
GetKeyNameTextA
。 - IInspectableKF_EXTENDED
要比硬编码的 0x100
更清晰。 - Zinovy Nis