没有完整的答案。谢谢大家的帮助。经过更多研究,我编写了转换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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
将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
}
Run Code Online (Sandbox Code Playgroud)
如果您正在执行此操作以响应WM_KEYDOWN传递扫描代码的消息或其他消息,则LPARAM可以跳过前两个步骤,因为这些只是按下VK代码到正确格式化的输入GetKeyNameText.有关第一个参数的功能和格式的详细信息,GetKeyNameText请参阅MSDN上的文档
注意:我在API调用中使用了W变量,因此您实际上需要使用a std::wstring来传递密钥名称,但您可以轻松地更改它以使用A版本.此外,如果您需要传递键盘布局以获取正确的扫描代码,您可以使用MapVirtualKeyEx.
| 归档时间: |
|
| 查看次数: |
5576 次 |
| 最近记录: |