Shift、Ctrl、または Alt キーの左右のバージョンを区別するにはMapVirtualKey()
、仮想キーのメッセージで渡される lParam の関数または「拡張キー」ビットを使用する必要があります。次の関数がその変換を実行します。メッセージから仮想キーコードと lParam を渡すだけで、必要に応じて左/右の特定の仮想キーコードが返されます。
WPARAM MapLeftRightKeys( WPARAM vk, LPARAM lParam)
{
WPARAM new_vk = vk;
UINT scancode = (lParam & 0x00ff0000) >> 16;
int extended = (lParam & 0x01000000) != 0;
switch (vk) {
case VK_SHIFT:
new_vk = MapVirtualKey(scancode, MAPVK_VSC_TO_VK_EX);
break;
case VK_CONTROL:
new_vk = extended ? VK_RCONTROL : VK_LCONTROL;
break;
case VK_MENU:
new_vk = extended ? VK_RMENU : VK_LMENU;
break;
default:
// not a key we map from generic to left/right specialized
// just return it.
new_vk = vk;
break;
}
return new_vk;
}
渡された仮想キーコードが左/右バージョンにマップされたものでない場合、元のキーコードが変更されずに返されます。したがって、 // /WM_KEYDOWN
左と右のバリアントを区別する必要があるときはいつでも、関数を介してメッセージ パラメータを実行できます。WM_KEYUP
WM_SYSKEYDOWN
WM_SYSKEYUP
を使用MapVirtualKey()
することで、左シフトと右シフトのスキャンコードが 0x2a と 0x36 であるという伝承を知る必要はありません。API がその詳細を処理します。そして、それらが異なることが起こった場合 (それが実際に起こるわけではありません)、あなたではなく、Windows がそれに対処する責任を負います。
したがって、WM_KEYDOWN
// WM_KEYUP
/ハンドラに次のようなコード行を追加するだけですWM_SYSKEYDOWN
:WM_SYSKEYUP
wparam = MapLeftRightKeys(wparam, lparam);
コードの残りの部分は、システム メッセージが最初にそれらを提供したかのように、左/右固有の VK コードで動作できます。