using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using libWin32.Win32.Exceptions; namespace libWin32.Win32.Input { public class KeyTranslator { const uint MAPVK_VK_TO_VSC = 0x00; const uint MAPVK_VSC_TO_VK = 0x01; const uint MAPVK_VK_TO_CHAR = 0x02; const uint MAPVK_VSC_TO_VK_EX = 0x03; const uint MAPVK_VK_TO_VSC_EX = 0x04; [DllImport("user32.dll")] static extern uint MapVirtualKey(uint uCode, uint uMapType); public static void MapVirtualKeyToScanCode(short VKKey, out short ScanCode) { ScanCode = 0; short scanCode = (short)KeyTranslator.MapVirtualKey((uint)VKKey, MAPVK_VK_TO_VSC); try { ScanCode = scanCode; } catch (InvalidCastException ex) { ScanCode = scanCode; StringBuilder builder = new StringBuilder(); builder.AppendFormat("VirtualKey: 0x{0:x2} translates to ScanCode: 0x{1:x8} which is not implemented.", VKKey, scanCode); throw new UnimplimentedDirectXScanCodeException(builder.ToString(), ex); } } public static void MapVirtualKeyToExtendedScanCode(short VKKey, out short ScanCode) { ScanCode = 0; short scanCode = (short)KeyTranslator.MapVirtualKey((uint)VKKey, MAPVK_VK_TO_VSC_EX); try { ScanCode = scanCode; } catch (InvalidCastException ex) { ScanCode = scanCode; StringBuilder builder = new StringBuilder(); builder.AppendFormat("VirtualKey: 0x{0:x2} translates to ScanCode: 0x{1:x8} which is not implemented.", VKKey, scanCode); throw new UnimplimentedDirectXScanCodeException(builder.ToString(), ex); } } public static void MapScanCodeToVirtualKey(short ScanCode, out uint VKKey) { uint vkKey = KeyTranslator.MapVirtualKey((uint)ScanCode, MAPVK_VSC_TO_VK); VKKey = vkKey; } public static void MapScanCodeToExtendedVirtualKey(short ScanCode, out uint VKKey) { uint vkKey = KeyTranslator.MapVirtualKey((uint)ScanCode, MAPVK_VSC_TO_VK_EX); VKKey = vkKey; } public static void MapVirtualKeyToChar(byte VKKey, out char ScanCode) { uint scanCode = KeyTranslator.MapVirtualKey((uint)VKKey, MAPVK_VK_TO_CHAR); ScanCode = (char)scanCode; } } }