仮想キーの説明を返すstd::string VirtualKeyCodeToStdString(UCHAR key)
のような機能を実装するにはどうすればよいですか?Windows仮想キーコード
例:入力VK_CAPITAL
で、戻り値はstd::string("Caps Lock")
仮想キーの説明を返すstd::string VirtualKeyCodeToStdString(UCHAR key)
のような機能を実装するにはどうすればよいですか?Windows仮想キーコード
例:入力VK_CAPITAL
で、戻り値はstd::string("Caps Lock")
完全な回答はありません。みんなあなたを助けてくれてありがとう。より多くの研究の後、私は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_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 ::文字列バージョンは:
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_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;
}
あなたの* std :: stringバージョン*は 'GetKeyNameTextA'を呼び出す必要があります。 – IInspectable
@IInspectable設定によって異なります。しかし、あなたは本当です。 – Inline
これらの外部設定はあなたのコントロールの範囲外です。そのため、文字の種類を明示するときに、関数のバージョンを明示する必要があります。 – IInspectable
キーのテキスト表現にVKコードを変換する簡単な方法はである:にVKコードを変換する
MapVirtualKey
スキャンコード。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
}
あなたはLPARAM
でスキャンコードを渡すWM_KEYDOWN
または他のメッセージに応答して、これをやっている場合は、それらがちょうどあるので、あなたは、最初の2つのステップをスキップすることができますGetKeyNameText
の適切なフォーマットの入力にVKコードをマッサージします。機能とGetKeyNameText
への最初のパラメータのフォーマットの詳細についてはdocumentation at MSDN
を参照してください。注:私はあなたが実際にキー名を渡すためにstd::wstring
を使用する必要があると思いますので、APIの呼び出しでWバリアントを使用ただし、Aバージョンを使用するように簡単に変更できます。また、適切なスキャンコードを取得するためにキーボードレイアウトを渡す必要がある場合は、MapVirtualKeyEx
を使用できます。
一般的に、それぞれの質問には、別々のでなければなりません。ここで2番目の質問を削除し、別に質問し、この質問にリンクし直すことを検討してください。 – DeathTails
@DeathTailsが編集されました。 – Inline
GetKeyNameText()は、組み込みの説明を提供します。仮想キーコードではなくスキャンコードが必要なので、必要に応じてMapVirtualKeyEx()を使用してください。 –