2016-06-29 39 views
2

仮想キーの説明を返すstd::string VirtualKeyCodeToStdString(UCHAR key)のような機能を実装するにはどうすればよいですか?Windows仮想キーコード

例:入力VK_CAPITALで、戻り値はstd::string("Caps Lock")

+0

一般的に、それぞれの質問には、別々のでなければなりません。ここで2番目の質問を削除し、別に質問し、この質問にリンクし直すことを検討してください。 – DeathTails

+0

@DeathTailsが編集されました。 – Inline

+3

GetKeyNameText()は、組み込みの説明を提供します。仮想キーコードではなくスキャンコードが必要なので、必要に応じてMapVirtualKeyEx()を使用してください。 –

答えて

2

完全な回答はありません。みんなあなたを助けてくれてありがとう。より多くの研究の後、私はvirtualKeystd::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; 
} 
+0

あなたの* std :: stringバージョン*は 'GetKeyNameTextA'を呼び出す必要があります。 – IInspectable

+0

@IInspectable設定によって異なります。しかし、あなたは本当です。 – Inline

+1

これらの外部設定はあなたのコントロールの範囲外です。そのため、文字の種類を明示するときに、関数のバージョンを明示する必要があります。 – IInspectable

5

キーのテキスト表現にVKコードを変換する簡単な方法はである:にVKコードを変換する

  1. 使用MapVirtualKeyスキャンコード。
  2. ビットシフトを行い、ビット16-23がスキャンコードである場合、
  3. 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を使用できます。

関連する問題