File: System\Windows\Input\KeyInteropTests.cs
Web Access
Project: src\src\Microsoft.DotNet.Wpf\tests\UnitTests\WindowsBase.Tests\WindowsBase.Tests.csproj (WindowsBase.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
namespace System.Windows.Input.Tests;
 
public class KeyInteropTests
{
    [Theory]
    [InlineData(VK_LBUTTON, Key.None)]
    [InlineData(VK_RBUTTON, Key.None)]
    [InlineData(VK_CANCEL, Key.Cancel)]
    [InlineData(VK_MBUTTON, Key.None)]
    [InlineData(VK_XBUTTON1, Key.None)]
    [InlineData(VK_XBUTTON2, Key.None)]
    [InlineData(0x07, Key.None)]
    [InlineData(VK_BACK, Key.Back)]
    [InlineData(VK_TAB, Key.Tab)]
    [InlineData(0x0A, Key.None)]
    [InlineData(0x0B, Key.None)]
    [InlineData(VK_CLEAR, Key.Clear)]
    [InlineData(VK_RETURN, Key.Return)]
    [InlineData(0x0E, Key.None)]
    [InlineData(0x0F, Key.None)]
    [InlineData(VK_SHIFT, Key.LeftShift)]
    [InlineData(VK_CONTROL, Key.LeftCtrl)]
    [InlineData(VK_MENU, Key.LeftAlt)]
    [InlineData(VK_PAUSE, Key.Pause)]
    [InlineData(VK_CAPITAL, Key.Capital)]
    [InlineData(VK_KANA, Key.KanaMode)]
    [InlineData(0x16, Key.None)]
    [InlineData(VK_JUNJA, Key.JunjaMode)]
    [InlineData(VK_FINAL, Key.FinalMode)]
    [InlineData(VK_KANJI, Key.KanjiMode)]
    [InlineData(0x1A, Key.None)]
    [InlineData(VK_ESCAPE, Key.Escape)]
    [InlineData(VK_CONVERT, Key.ImeConvert)]
    [InlineData(VK_NONCONVERT, Key.ImeNonConvert)]
    [InlineData(VK_ACCEPT, Key.ImeAccept)]
    [InlineData(VK_MODECHANGE, Key.ImeModeChange)]
    [InlineData(VK_SPACE, Key.Space)]
    [InlineData(VK_PRIOR, Key.Prior)]
    [InlineData(VK_NEXT, Key.Next)]
    [InlineData(VK_END, Key.End)]
    [InlineData(VK_HOME, Key.Home)]
    [InlineData(VK_LEFT, Key.Left)]
    [InlineData(VK_UP, Key.Up)]
    [InlineData(VK_RIGHT, Key.Right)]
    [InlineData(VK_DOWN, Key.Down)]
    [InlineData(VK_SELECT, Key.Select)]
    [InlineData(VK_PRINT, Key.Print)]
    [InlineData(VK_EXECUTE, Key.Execute)]
    [InlineData(VK_SNAPSHOT, Key.Snapshot)]
    [InlineData(VK_INSERT, Key.Insert)]
    [InlineData(VK_DELETE, Key.Delete)]
    [InlineData(VK_HELP, Key.Help)]
    [InlineData(VK_0, Key.D0)]
    [InlineData(VK_1, Key.D1)]
    [InlineData(VK_2, Key.D2)]
    [InlineData(VK_3, Key.D3)]
    [InlineData(VK_4, Key.D4)]
    [InlineData(VK_5, Key.D5)]
    [InlineData(VK_6, Key.D6)]
    [InlineData(VK_7, Key.D7)]
    [InlineData(VK_8, Key.D8)]
    [InlineData(VK_9, Key.D9)]
    [InlineData(0x3A, Key.None)]
    [InlineData(0x3B, Key.None)]
    [InlineData(0x3C, Key.None)]
    [InlineData(0x3D, Key.None)]
    [InlineData(0x3E, Key.None)]
    [InlineData(0x3F, Key.None)]
    [InlineData(VK_A, Key.A)]
    [InlineData(VK_B, Key.B)]
    [InlineData(VK_C, Key.C)]
    [InlineData(VK_D, Key.D)]
    [InlineData(VK_E, Key.E)]
    [InlineData(VK_F, Key.F)]
    [InlineData(VK_G, Key.G)]
    [InlineData(VK_H, Key.H)]
    [InlineData(VK_I, Key.I)]
    [InlineData(VK_J, Key.J)]
    [InlineData(VK_K, Key.K)]
    [InlineData(VK_L, Key.L)]
    [InlineData(VK_M, Key.M)]
    [InlineData(VK_N, Key.N)]
    [InlineData(VK_O, Key.O)]
    [InlineData(VK_P, Key.P)]
    [InlineData(VK_Q, Key.Q)]
    [InlineData(VK_R, Key.R)]
    [InlineData(VK_S, Key.S)]
    [InlineData(VK_T, Key.T)]
    [InlineData(VK_U, Key.U)]
    [InlineData(VK_V, Key.V)]
    [InlineData(VK_W, Key.W)]
    [InlineData(VK_X, Key.X)]
    [InlineData(VK_Y, Key.Y)]
    [InlineData(VK_Z, Key.Z)]
    [InlineData(VK_LWIN, Key.LWin)]
    [InlineData(VK_RWIN, Key.RWin)]
    [InlineData(VK_APPS, Key.Apps)]
    [InlineData(0x5E, Key.None)]
    [InlineData(VK_SLEEP, Key.Sleep)]
    [InlineData(VK_NUMPAD0, Key.NumPad0)]
    [InlineData(VK_NUMPAD1, Key.NumPad1)]
    [InlineData(VK_NUMPAD2, Key.NumPad2)]
    [InlineData(VK_NUMPAD3, Key.NumPad3)]
    [InlineData(VK_NUMPAD4, Key.NumPad4)]
    [InlineData(VK_NUMPAD5, Key.NumPad5)]
    [InlineData(VK_NUMPAD6, Key.NumPad6)]
    [InlineData(VK_NUMPAD7, Key.NumPad7)]
    [InlineData(VK_NUMPAD8, Key.NumPad8)]
    [InlineData(VK_NUMPAD9, Key.NumPad9)]
    [InlineData(VK_MULTIPLY, Key.Multiply)]
    [InlineData(VK_ADD, Key.Add)]
    [InlineData(VK_SEPARATOR, Key.Separator)]
    [InlineData(VK_SUBTRACT, Key.Subtract)]
    [InlineData(VK_DECIMAL, Key.Decimal)]
    [InlineData(VK_DIVIDE, Key.Divide)]
    [InlineData(VK_F1, Key.F1)]
    [InlineData(VK_F2, Key.F2)]
    [InlineData(VK_F3, Key.F3)]
    [InlineData(VK_F4, Key.F4)]
    [InlineData(VK_F5, Key.F5)]
    [InlineData(VK_F6, Key.F6)]
    [InlineData(VK_F7, Key.F7)]
    [InlineData(VK_F8, Key.F8)]
    [InlineData(VK_F9, Key.F9)]
    [InlineData(VK_F10, Key.F10)]
    [InlineData(VK_F11, Key.F11)]
    [InlineData(VK_F12, Key.F12)]
    [InlineData(VK_F13, Key.F13)]
    [InlineData(VK_F14, Key.F14)]
    [InlineData(VK_F15, Key.F15)]
    [InlineData(VK_F16, Key.F16)]
    [InlineData(VK_F17, Key.F17)]
    [InlineData(VK_F18, Key.F18)]
    [InlineData(VK_F19, Key.F19)]
    [InlineData(VK_F20, Key.F20)]
    [InlineData(VK_F21, Key.F21)]
    [InlineData(VK_F22, Key.F22)]
    [InlineData(VK_F23, Key.F23)]
    [InlineData(VK_F24, Key.F24)]
    [InlineData(VK_NUMLOCK, Key.NumLock)]
    [InlineData(VK_SCROLL, Key.Scroll)]
    [InlineData(VK_OEM_NEC_EQUAL, Key.None)]
    //[InlineData(VK_OEM_FJ_JISHO, Key.None)]
    [InlineData(VK_OEM_FJ_MASSHOU, Key.None)]
    [InlineData(VK_OEM_FJ_TOUROKU, Key.None)]
    [InlineData(VK_OEM_FJ_LOYA, Key.None)]
    [InlineData(VK_OEM_FJ_ROYA, Key.None)]
    [InlineData(VK_LSHIFT, Key.LeftShift)]
    [InlineData(VK_RSHIFT, Key.RightShift)]
    [InlineData(VK_LCONTROL, Key.LeftCtrl)]
    [InlineData(VK_RCONTROL, Key.RightCtrl)]
    [InlineData(VK_LMENU, Key.LeftAlt)]
    [InlineData(VK_RMENU, Key.RightAlt)]
    [InlineData(VK_BROWSER_BACK, Key.BrowserBack)]
    [InlineData(VK_BROWSER_FORWARD, Key.BrowserForward)]
    [InlineData(VK_BROWSER_REFRESH, Key.BrowserRefresh)]
    [InlineData(VK_BROWSER_STOP, Key.BrowserStop)]
    [InlineData(VK_BROWSER_SEARCH, Key.BrowserSearch)]
    [InlineData(VK_BROWSER_FAVORITES, Key.BrowserFavorites)]
    [InlineData(VK_BROWSER_HOME, Key.BrowserHome)]
    [InlineData(VK_VOLUME_MUTE, Key.VolumeMute)]
    [InlineData(VK_VOLUME_DOWN, Key.VolumeDown)]
    [InlineData(VK_VOLUME_UP, Key.VolumeUp)]
    [InlineData(VK_MEDIA_NEXT_TRACK, Key.MediaNextTrack)]
    [InlineData(VK_MEDIA_PREV_TRACK, Key.MediaPreviousTrack)]
    [InlineData(VK_MEDIA_STOP, Key.MediaStop)]
    [InlineData(VK_MEDIA_PLAY_PAUSE, Key.MediaPlayPause)]
    [InlineData(VK_LAUNCH_MAIL, Key.LaunchMail)]
    [InlineData(VK_LAUNCH_MEDIA_SELECT, Key.SelectMedia)]
    [InlineData(VK_LAUNCH_APP1, Key.LaunchApplication1)]
    [InlineData(VK_LAUNCH_APP2, Key.LaunchApplication2)]
    [InlineData(0xB8, Key.None)]
    [InlineData(0xB9, Key.None)]
    [InlineData(VK_OEM_1, Key.OemSemicolon)]
    [InlineData(VK_OEM_PLUS, Key.OemPlus)]
    [InlineData(VK_OEM_COMMA, Key.OemComma)]
    [InlineData(VK_OEM_MINUS, Key.OemMinus)]
    [InlineData(VK_OEM_PERIOD, Key.OemPeriod)]
    [InlineData(VK_OEM_2, Key.OemQuestion)]
    [InlineData(VK_OEM_3, Key.OemTilde)]
    [InlineData(VK_C1, Key.AbntC1)]
    [InlineData(VK_C2, Key.AbntC2)]
    [InlineData(VK_GAMEPAD_A, Key.None)]
    [InlineData(VK_GAMEPAD_B, Key.None)]
    [InlineData(VK_GAMEPAD_X, Key.None)]
    [InlineData(VK_GAMEPAD_Y, Key.None)]
    [InlineData(VK_GAMEPAD_RIGHT_SHOULDER, Key.None)]
    [InlineData(VK_GAMEPAD_LEFT_SHOULDER, Key.None)]
    [InlineData(VK_GAMEPAD_LEFT_TRIGGER, Key.None)]
    [InlineData(VK_GAMEPAD_RIGHT_TRIGGER, Key.None)]
    [InlineData(VK_GAMEPAD_DPAD_UP, Key.None)]
    [InlineData(VK_GAMEPAD_DPAD_DOWN, Key.None)]
    [InlineData(VK_GAMEPAD_DPAD_LEFT, Key.None)]
    [InlineData(VK_GAMEPAD_DPAD_RIGHT, Key.None)]
    [InlineData(VK_GAMEPAD_MENU, Key.None)]
    [InlineData(VK_GAMEPAD_VIEW, Key.None)]
    [InlineData(VK_GAMEPAD_LEFT_THUMBSTICK_BUTTON, Key.None)]
    [InlineData(VK_GAMEPAD_RIGHT_THUMBSTICK_BUTTON, Key.None)]
    [InlineData(VK_GAMEPAD_LEFT_THUMBSTICK_UP, Key.None)]
    [InlineData(VK_GAMEPAD_LEFT_THUMBSTICK_DOWN, Key.None)]
    [InlineData(VK_GAMEPAD_LEFT_THUMBSTICK_RIGHT, Key.None)]
    [InlineData(VK_GAMEPAD_LEFT_THUMBSTICK_LEFT, Key.None)]
    [InlineData(VK_GAMEPAD_RIGHT_THUMBSTICK_UP, Key.None)]
    [InlineData(VK_GAMEPAD_RIGHT_THUMBSTICK_DOWN, Key.None)]
    [InlineData(VK_GAMEPAD_RIGHT_THUMBSTICK_RIGHT, Key.None)]
    [InlineData(VK_GAMEPAD_RIGHT_THUMBSTICK_LEFT, Key.None)]
    [InlineData(VK_OEM_4, Key.OemOpenBrackets)]
    [InlineData(VK_OEM_5, Key.OemPipe)]
    [InlineData(VK_OEM_6, Key.OemCloseBrackets)]
    [InlineData(VK_OEM_7, Key.OemQuotes)]
    [InlineData(VK_OEM_8, Key.Oem8)]
    [InlineData(0xE0, Key.None)]
    [InlineData(VK_OEM_AX, Key.None)]
    [InlineData(VK_OEM_102, Key.OemBackslash)]
    [InlineData(VK_ICO_HELP, Key.None)]
    [InlineData(VK_ICO_00, Key.None)]
    [InlineData(VK_PROCESSKEY, Key.ImeProcessed)]
    [InlineData(VK_ICO_CLEAR, Key.None)]
    [InlineData(VK_PACKET, Key.None)]
    [InlineData(0xE8, Key.None)]
    [InlineData(VK_OEM_RESET, Key.None)]
    [InlineData(VK_OEM_JUMP, Key.None)]
    [InlineData(VK_OEM_PA1, Key.None)]
    [InlineData(VK_OEM_PA2, Key.None)]
    [InlineData(VK_OEM_PA3, Key.None)]
    [InlineData(VK_OEM_WSCTRL, Key.None)]
    [InlineData(VK_OEM_CUSEL, Key.None)]
    [InlineData(VK_OEM_ATTN, Key.OemAttn)]
    [InlineData(VK_OEM_FINISH, Key.OemFinish)]
    [InlineData(VK_OEM_COPY, Key.OemCopy)]
    [InlineData(VK_OEM_AUTO, Key.OemAuto)]
    [InlineData(VK_OEM_ENLW, Key.OemEnlw)]
    [InlineData(VK_OEM_BACKTAB, Key.OemBackTab)]
    [InlineData(VK_ATTN, Key.Attn)]
    [InlineData(VK_CRSEL, Key.CrSel)]
    [InlineData(VK_EXSEL, Key.ExSel)]
    [InlineData(VK_EREOF, Key.EraseEof)]
    [InlineData(VK_PLAY, Key.Play)]
    [InlineData(VK_ZOOM, Key.Zoom)]
    [InlineData(VK_NONAME, Key.NoName)]
    [InlineData(VK_PA1, Key.Pa1)]
    [InlineData(VK_OEM_CLEAR, Key.OemClear)]
    [InlineData(0xFF, Key.None)]
    [InlineData(0x100, Key.None)]
    [InlineData(int.MinValue, Key.None)]
    [InlineData(-1, Key.None)]
    [InlineData(int.MaxValue, Key.None)]
    public void KeyFromVirtualKey_Invoke_ReturnsExpected(int virtualKey, Key expected)
    {
        Assert.Equal(expected, KeyInterop.KeyFromVirtualKey(virtualKey));
    }
 
    [Theory]
    [InlineData(Key.None, 0)]
    [InlineData(Key.Cancel, VK_CANCEL)]
    [InlineData(Key.Back, VK_BACK)]
    [InlineData(Key.Tab, VK_TAB)]
    [InlineData(Key.Clear, VK_CLEAR)]
    [InlineData(Key.Return, VK_RETURN)]
    //[InlineData(Key.Enter, VK_RETURN)]
    [InlineData(Key.Pause, VK_PAUSE)]
    [InlineData(Key.Capital, VK_CAPITAL)]
    //[InlineData(Key.CapsLock, VK_CAPITAL)]
    [InlineData(Key.KanaMode, VK_KANA)]
    //[InlineData(Key.HangulMode, VK_KANA)]
    [InlineData(Key.JunjaMode, VK_JUNJA)]
    [InlineData(Key.FinalMode, VK_FINAL)]
    [InlineData(Key.HanjaMode, VK_KANJI)]
    //[InlineData(Key.KanjiMode, VK_KANJI)]
    [InlineData(Key.Escape, VK_ESCAPE)]
    [InlineData(Key.ImeConvert, VK_CONVERT)]
    [InlineData(Key.ImeNonConvert, VK_NONCONVERT)]
    [InlineData(Key.ImeAccept, VK_ACCEPT)]
    [InlineData(Key.ImeModeChange, VK_MODECHANGE)]
    [InlineData(Key.Space, VK_SPACE)]
    [InlineData(Key.Prior, VK_PRIOR)]
    [InlineData(Key.Next, VK_NEXT)]
    //[InlineData(Key.PageDown, VK_NEXT)]
    [InlineData(Key.End, VK_END)]
    [InlineData(Key.Home, VK_HOME)]
    [InlineData(Key.Left, VK_LEFT)]
    [InlineData(Key.Up, VK_UP)]
    [InlineData(Key.Right, VK_RIGHT)]
    [InlineData(Key.Down, VK_DOWN)]
    [InlineData(Key.Select, VK_SELECT)]
    [InlineData(Key.Print, VK_PRINT)]
    [InlineData(Key.Execute, VK_EXECUTE)]
    [InlineData(Key.Snapshot, VK_SNAPSHOT)]
    //[InlineData(Key.PrintScreen, VK_SNAPSHOT)]
    [InlineData(Key.Insert, VK_INSERT)]
    [InlineData(Key.Delete, VK_DELETE)]
    [InlineData(Key.Help, VK_HELP)]
    [InlineData(Key.D0, VK_0)]
    [InlineData(Key.D1, VK_1)]
    [InlineData(Key.D2, VK_2)]
    [InlineData(Key.D3, VK_3)]
    [InlineData(Key.D4, VK_4)]
    [InlineData(Key.D5, VK_5)]
    [InlineData(Key.D6, VK_6)]
    [InlineData(Key.D7, VK_7)]
    [InlineData(Key.D8, VK_8)]
    [InlineData(Key.D9, VK_9)]
    [InlineData(Key.A, VK_A)]
    [InlineData(Key.B, VK_B)]
    [InlineData(Key.C, VK_C)]
    [InlineData(Key.D, VK_D)]
    [InlineData(Key.E, VK_E)]
    [InlineData(Key.F, VK_F)]
    [InlineData(Key.G, VK_G)]
    [InlineData(Key.H, VK_H)]
    [InlineData(Key.I, VK_I)]
    [InlineData(Key.J, VK_J)]
    [InlineData(Key.K, VK_K)]
    [InlineData(Key.L, VK_L)]
    [InlineData(Key.M, VK_M)]
    [InlineData(Key.N, VK_N)]
    [InlineData(Key.O, VK_O)]
    [InlineData(Key.P, VK_P)]
    [InlineData(Key.Q, VK_Q)]
    [InlineData(Key.R, VK_R)]
    [InlineData(Key.S, VK_S)]
    [InlineData(Key.T, VK_T)]
    [InlineData(Key.U, VK_U)]
    [InlineData(Key.V, VK_V)]
    [InlineData(Key.W, VK_W)]
    [InlineData(Key.X, VK_X)]
    [InlineData(Key.Y, VK_Y)]
    [InlineData(Key.Z, VK_Z)]
    [InlineData(Key.LWin, VK_LWIN)]
    [InlineData(Key.RWin, VK_RWIN)]
    [InlineData(Key.Apps, VK_APPS)]
    [InlineData(Key.Sleep, VK_SLEEP)]
    [InlineData(Key.NumPad0, VK_NUMPAD0)]
    [InlineData(Key.NumPad1, VK_NUMPAD1)]
    [InlineData(Key.NumPad2, VK_NUMPAD2)]
    [InlineData(Key.NumPad3, VK_NUMPAD3)]
    [InlineData(Key.NumPad4, VK_NUMPAD4)]
    [InlineData(Key.NumPad5, VK_NUMPAD5)]
    [InlineData(Key.NumPad6, VK_NUMPAD6)]
    [InlineData(Key.NumPad7, VK_NUMPAD7)]
    [InlineData(Key.NumPad8, VK_NUMPAD8)]
    [InlineData(Key.NumPad9, VK_NUMPAD9)]
    [InlineData(Key.Multiply, VK_MULTIPLY)]
    [InlineData(Key.Add, VK_ADD)]
    [InlineData(Key.Separator, VK_SEPARATOR)]
    [InlineData(Key.Subtract, VK_SUBTRACT)]
    [InlineData(Key.Decimal, VK_DECIMAL)]
    [InlineData(Key.Divide, VK_DIVIDE)]
    [InlineData(Key.F1, VK_F1)]
    [InlineData(Key.F2, VK_F2)]
    [InlineData(Key.F3, VK_F3)]
    [InlineData(Key.F4, VK_F4)]
    [InlineData(Key.F5, VK_F5)]
    [InlineData(Key.F6, VK_F6)]
    [InlineData(Key.F7, VK_F7)]
    [InlineData(Key.F8, VK_F8)]
    [InlineData(Key.F9, VK_F9)]
    [InlineData(Key.F10, VK_F10)]
    [InlineData(Key.F11, VK_F11)]
    [InlineData(Key.F12, VK_F12)]
    [InlineData(Key.F13, VK_F13)]
    [InlineData(Key.F14, VK_F14)]
    [InlineData(Key.F15, VK_F15)]
    [InlineData(Key.F16, VK_F16)]
    [InlineData(Key.F17, VK_F17)]
    [InlineData(Key.F18, VK_F18)]
    [InlineData(Key.F19, VK_F19)]
    [InlineData(Key.F20, VK_F20)]
    [InlineData(Key.F21, VK_F21)]
    [InlineData(Key.F22, VK_F22)]
    [InlineData(Key.F23, VK_F23)]
    [InlineData(Key.F24, VK_F24)]
    [InlineData(Key.NumLock, VK_NUMLOCK)]
    [InlineData(Key.Scroll, VK_SCROLL)]
    [InlineData(Key.LeftShift, VK_LSHIFT)]
    [InlineData(Key.RightShift, VK_RSHIFT)]
    [InlineData(Key.LeftCtrl, VK_LCONTROL)]
    [InlineData(Key.RightCtrl, VK_RCONTROL)]
    [InlineData(Key.LeftAlt, VK_LMENU)]
    [InlineData(Key.RightAlt, VK_RMENU)]
    [InlineData(Key.BrowserBack, VK_BROWSER_BACK)]
    [InlineData(Key.BrowserForward, VK_BROWSER_FORWARD)]
    [InlineData(Key.BrowserRefresh, VK_BROWSER_REFRESH)]
    [InlineData(Key.BrowserStop, VK_BROWSER_STOP)]
    [InlineData(Key.BrowserSearch, VK_BROWSER_SEARCH)]
    [InlineData(Key.BrowserFavorites, VK_BROWSER_FAVORITES)]
    [InlineData(Key.BrowserHome, VK_BROWSER_HOME)]
    [InlineData(Key.VolumeMute, VK_VOLUME_MUTE)]
    [InlineData(Key.VolumeDown, VK_VOLUME_DOWN)]
    [InlineData(Key.VolumeUp, VK_VOLUME_UP)]
    [InlineData(Key.MediaNextTrack, VK_MEDIA_NEXT_TRACK)]
    [InlineData(Key.MediaPreviousTrack, VK_MEDIA_PREV_TRACK)]
    [InlineData(Key.MediaStop, VK_MEDIA_STOP)]
    [InlineData(Key.MediaPlayPause, VK_MEDIA_PLAY_PAUSE)]
    [InlineData(Key.LaunchMail, VK_LAUNCH_MAIL)]
    [InlineData(Key.SelectMedia, VK_LAUNCH_MEDIA_SELECT)]
    [InlineData(Key.LaunchApplication1, VK_LAUNCH_APP1)]
    [InlineData(Key.LaunchApplication2, VK_LAUNCH_APP2)]
    [InlineData(Key.OemSemicolon, VK_OEM_1)]
    [InlineData(Key.OemPlus, VK_OEM_PLUS)]
    [InlineData(Key.OemComma, VK_OEM_COMMA)]
    [InlineData(Key.OemMinus, VK_OEM_MINUS)]
    [InlineData(Key.OemPeriod, VK_OEM_PERIOD)]
    [InlineData(Key.Oem2, VK_OEM_2)]
    //[InlineData(Key.OemQuestion, VK_OEM_2)]
    [InlineData(Key.Oem3, VK_OEM_3)]
    //[InlineData(Key.OemTilde, VK_OEM_3)]
    [InlineData(Key.AbntC1, VK_C1)]
    [InlineData(Key.AbntC2, VK_C2)]
    [InlineData(Key.Oem4, VK_OEM_4)]
    //[InlineData(Key.OemOpenBrackets, VK_OEM_4)]
    //[InlineData(Key.Oem5, VK_OEM_5)]
    [InlineData(Key.OemPipe, VK_OEM_5)]
    [InlineData(Key.Oem6, VK_OEM_6)]
    //[InlineData(Key.OemCloseBrackets, VK_OEM_6)]
    [InlineData(Key.Oem7, VK_OEM_7)]
    //[InlineData(Key.OemQuotes, VK_OEM_7)]
    [InlineData(Key.Oem8, VK_OEM_8)]
    [InlineData(Key.Oem102, VK_OEM_102)]
    //[InlineData(Key.OemBackslash, VK_OEM_102)]
    [InlineData(Key.ImeProcessed, VK_PROCESSKEY)]
    [InlineData(Key.OemAttn, VK_OEM_ATTN)]
    //[InlineData(Key.DbeAlphanumeric, VK_OEM_ATTN)]
    [InlineData(Key.OemFinish, VK_OEM_FINISH)]
    //[InlineData(Key.DbeKatakana, VK_OEM_FINISH)]
    [InlineData(Key.OemCopy, VK_OEM_COPY)]
    //[InlineData(Key.DbeHiragana, VK_OEM_COPY)]
    [InlineData(Key.OemAuto, VK_OEM_AUTO)]
    //[InlineData(Key.DbeSbcsChar, VK_OEM_AUTO)]
    [InlineData(Key.OemEnlw, VK_OEM_ENLW)]
    //[InlineData(Key.DbeDbcsChar, VK_OEM_ENLW)]
    [InlineData(Key.OemBackTab, VK_OEM_BACKTAB)]
    //[InlineData(Key.DbeRoman, VK_OEM_BACKTAB)]
    [InlineData(Key.Attn, VK_ATTN)]
    //[InlineData(Key.DbeNoRoman, VK_ATTN)]
    [InlineData(Key.CrSel, VK_CRSEL)]
    //[InlineData(Key.DbeEnterWordRegisterMode, VK_CRSEL)]
    [InlineData(Key.ExSel, VK_EXSEL)]
    //[InlineData(Key.DbeEnterImeConfigureMode, VK_EXSEL)]
    [InlineData(Key.EraseEof, VK_EREOF)]
    //[InlineData(Key.DbeFlushString, VK_EREOF)]
    [InlineData(Key.Play, VK_PLAY)]
    //[InlineData(Key.DbeCodeInput, VK_PLAY)]
    [InlineData(Key.Zoom, VK_ZOOM)]
    //[InlineData(Key.DbeNoCodeInput, VK_ZOOM)]
    [InlineData(Key.NoName, VK_NONAME)]
    //[InlineData(Key.DbeDetermineString, VK_NONAME)]
    [InlineData(Key.Pa1, VK_PA1)]
    //[InlineData(Key.DbeEnterDialogConversionMode, VK_PA1)]
    [InlineData(Key.OemClear, VK_OEM_CLEAR)]
    [InlineData(Key.DeadCharProcessed, 0)]
    [InlineData((Key)int.MinValue, 0)]
    [InlineData((Key)(-1), 0)]
    [InlineData(Key.DeadCharProcessed + 1, 0)]
    [InlineData((Key)int.MaxValue, 0)]
    public void VirtualKeyFromKey_Invoke_ReturnsExpected(Key key, int expected)
    {
        Assert.Equal(expected, KeyInterop.VirtualKeyFromKey(key));
    }
 
    private const int VK_LBUTTON = 0x01;
    private const int VK_RBUTTON = 0x02;
    private const int VK_CANCEL = 0x03;
    private const int VK_MBUTTON = 0x04;
    private const int VK_XBUTTON1 = 0x05;
    private const int VK_XBUTTON2 = 0x06;
    private const int VK_BACK = 0x08;
    private const int VK_TAB = 0x09;
    private const int VK_CLEAR = 0x0C;
    private const int VK_RETURN = 0x0D;
    private const int VK_SHIFT = 0x10;
    private const int VK_CONTROL = 0x11;
    private const int VK_MENU = 0x12;
    private const int VK_PAUSE = 0x13;
    private const int VK_CAPITAL = 0x14;
    private const int VK_KANA = 0x15;
    // private const int VK_HANGEUL = 0x15;
    // private const int VK_HANGUL = 0x15;
    private const int VK_JUNJA = 0x17;
    private const int VK_FINAL = 0x18;
    // private const int VK_HANJA = 0x19;
    private const int VK_KANJI = 0x19;
    private const int VK_ESCAPE = 0x1B;
    private const int VK_CONVERT = 0x1C;
    private const int VK_NONCONVERT = 0x1D;
    private const int VK_ACCEPT = 0x1E;
    private const int VK_MODECHANGE = 0x1F;
    private const int VK_SPACE = 0x20;
    private const int VK_PRIOR = 0x21;
    private const int VK_NEXT = 0x22;
    private const int VK_END = 0x23;
    private const int VK_HOME = 0x24;
    private const int VK_LEFT = 0x25;
    private const int VK_UP = 0x26;
    private const int VK_RIGHT = 0x27;
    private const int VK_DOWN = 0x28;
    private const int VK_SELECT = 0x29;
    private const int VK_PRINT = 0x2A;
    private const int VK_EXECUTE = 0x2B;
    private const int VK_SNAPSHOT = 0x2C;
    private const int VK_INSERT = 0x2D;
    private const int VK_DELETE = 0x2E;
    private const int VK_HELP = 0x2F;
    private const int VK_0 = 0x30;
    private const int VK_1 = 0x31;
    private const int VK_2 = 0x32;
    private const int VK_3 = 0x33;
    private const int VK_4 = 0x34;
    private const int VK_5 = 0x35;
    private const int VK_6 = 0x36;
    private const int VK_7 = 0x37;
    private const int VK_8 = 0x38;
    private const int VK_9 = 0x39;
    private const int VK_A = 0x41;
    private const int VK_B = 0x42;
    private const int VK_C = 0x43;
    private const int VK_D = 0x44;
    private const int VK_E = 0x45;
    private const int VK_F = 0x46;
    private const int VK_G = 0x47;
    private const int VK_H = 0x48;
    private const int VK_I = 0x49;
    private const int VK_J = 0x4A;
    private const int VK_K = 0x4B;
    private const int VK_L = 0x4C;
    private const int VK_M = 0x4D;
    private const int VK_N = 0x4E;
    private const int VK_O = 0x4F;
    private const int VK_P = 0x50;
    private const int VK_Q = 0x51;
    private const int VK_R = 0x52;
    private const int VK_S = 0x53;
    private const int VK_T = 0x54;
    private const int VK_U = 0x55;
    private const int VK_V = 0x56;
    private const int VK_W = 0x57;
    private const int VK_X = 0x58;
    private const int VK_Y = 0x59;
    private const int VK_Z = 0x5A;
    private const int VK_LWIN = 0x5B;
    private const int VK_RWIN = 0x5C;
    private const int VK_APPS = 0x5D;
    // private const int VK_POWER = 0x5E;
    private const int VK_SLEEP = 0x5F;
    private const int VK_NUMPAD0 = 0x60;
    private const int VK_NUMPAD1 = 0x61;
    private const int VK_NUMPAD2 = 0x62;
    private const int VK_NUMPAD3 = 0x63;
    private const int VK_NUMPAD4 = 0x64;
    private const int VK_NUMPAD5 = 0x65;
    private const int VK_NUMPAD6 = 0x66;
    private const int VK_NUMPAD7 = 0x67;
    private const int VK_NUMPAD8 = 0x68;
    private const int VK_NUMPAD9 = 0x69;
    private const int VK_MULTIPLY = 0x6A;
    private const int VK_ADD = 0x6B;
    private const int VK_SEPARATOR = 0x6C;
    private const int VK_SUBTRACT = 0x6D;
    private const int VK_DECIMAL = 0x6E;
    private const int VK_DIVIDE = 0x6F;
    private const int VK_F1 = 0x70;
    private const int VK_F2 = 0x71;
    private const int VK_F3 = 0x72;
    private const int VK_F4 = 0x73;
    private const int VK_F5 = 0x74;
    private const int VK_F6 = 0x75;
    private const int VK_F7 = 0x76;
    private const int VK_F8 = 0x77;
    private const int VK_F9 = 0x78;
    private const int VK_F10 = 0x79;
    private const int VK_F11 = 0x7A;
    private const int VK_F12 = 0x7B;
    private const int VK_F13 = 0x7C;
    private const int VK_F14 = 0x7D;
    private const int VK_F15 = 0x7E;
    private const int VK_F16 = 0x7F;
    private const int VK_F17 = 0x80;
    private const int VK_F18 = 0x81;
    private const int VK_F19 = 0x82;
    private const int VK_F20 = 0x83;
    private const int VK_F21 = 0x84;
    private const int VK_F22 = 0x85;
    private const int VK_F23 = 0x86;
    private const int VK_F24 = 0x87;
    private const int VK_NUMLOCK = 0x90;
    private const int VK_SCROLL = 0x91;
    private const int VK_OEM_NEC_EQUAL = 0x92;
    // private const int VK_OEM_FJ_JISHO = 0x92;
    private const int VK_OEM_FJ_MASSHOU = 0x93;
    private const int VK_OEM_FJ_TOUROKU = 0x94;
    private const int VK_OEM_FJ_LOYA = 0x95;
    private const int VK_OEM_FJ_ROYA = 0x96;
    private const int VK_LSHIFT = 0xA0;
    private const int VK_RSHIFT = 0xA1;
    private const int VK_LCONTROL = 0xA2;
    private const int VK_RCONTROL = 0xA3;
    private const int VK_RMENU = 0xA5;
    private const int VK_LMENU = 0xA4;
    private const int VK_BROWSER_BACK = 0xA6;
    private const int VK_BROWSER_FORWARD = 0xA7;
    private const int VK_BROWSER_REFRESH = 0xA8;
    private const int VK_BROWSER_STOP = 0xA9;
    private const int VK_BROWSER_SEARCH = 0xAA;
    private const int VK_BROWSER_FAVORITES = 0xAB;
    private const int VK_BROWSER_HOME = 0xAC;
    private const int VK_VOLUME_MUTE = 0xAD;
    private const int VK_VOLUME_DOWN = 0xAE;
    private const int VK_VOLUME_UP = 0xAF;
    private const int VK_MEDIA_NEXT_TRACK = 0xB0;
    private const int VK_MEDIA_PREV_TRACK = 0xB1;
    private const int VK_MEDIA_STOP = 0xB2;
    private const int VK_MEDIA_PLAY_PAUSE = 0xB3;
    private const int VK_LAUNCH_MAIL = 0xB4;
    private const int VK_LAUNCH_MEDIA_SELECT = 0xB5;
    private const int VK_LAUNCH_APP1 = 0xB6;
    private const int VK_LAUNCH_APP2 = 0xB7;
    private const int VK_OEM_1 = 0xBA;
    private const int VK_OEM_PLUS = 0xBB;
    private const int VK_OEM_COMMA = 0xBC;
    private const int VK_OEM_MINUS = 0xBD;
    private const int VK_OEM_PERIOD = 0xBE;
    private const int VK_OEM_2 = 0xBF;
    private const int VK_OEM_3 = 0xC0;
    private const int VK_C1 = 0xC1;   // Brazilian ABNT_C1 key (not defined in winuser.h).
    private const int VK_C2 = 0xC2;   // Brazilian ABNT_C2 key (not defined in winuser.h).
    private const int VK_GAMEPAD_A = 0xC3;
    private const int VK_GAMEPAD_B = 0xC4;
    private const int VK_GAMEPAD_X = 0xC5;
    private const int VK_GAMEPAD_Y = 0xC6;
    private const int VK_GAMEPAD_RIGHT_SHOULDER = 0xC7;
    private const int VK_GAMEPAD_LEFT_SHOULDER = 0xC8;
    private const int VK_GAMEPAD_LEFT_TRIGGER = 0xC9;
    private const int VK_GAMEPAD_RIGHT_TRIGGER = 0xCA;
    private const int VK_GAMEPAD_DPAD_UP = 0xCB;
    private const int VK_GAMEPAD_DPAD_DOWN = 0xCC;
    private const int VK_GAMEPAD_DPAD_LEFT = 0xCD;
    private const int VK_GAMEPAD_DPAD_RIGHT = 0xCE;
    private const int VK_GAMEPAD_MENU = 0xCF;
    private const int VK_GAMEPAD_VIEW = 0xD0;
    private const int VK_GAMEPAD_LEFT_THUMBSTICK_BUTTON = 0xD1;
    private const int VK_GAMEPAD_RIGHT_THUMBSTICK_BUTTON = 0xD2;
    private const int VK_GAMEPAD_LEFT_THUMBSTICK_UP = 0xD3;
    private const int VK_GAMEPAD_LEFT_THUMBSTICK_DOWN = 0xD4;
    private const int VK_GAMEPAD_LEFT_THUMBSTICK_RIGHT = 0xD5;
    private const int VK_GAMEPAD_LEFT_THUMBSTICK_LEFT = 0xD6;
    private const int VK_GAMEPAD_RIGHT_THUMBSTICK_UP = 0xD7;
    private const int VK_GAMEPAD_RIGHT_THUMBSTICK_DOWN = 0xD8;
    private const int VK_GAMEPAD_RIGHT_THUMBSTICK_RIGHT = 0xD9;
    private const int VK_GAMEPAD_RIGHT_THUMBSTICK_LEFT = 0xDA;
    private const int VK_OEM_4 = 0xDB;
    private const int VK_OEM_5 = 0xDC;
    private const int VK_OEM_6 = 0xDD;
    private const int VK_OEM_7 = 0xDE;
    private const int VK_OEM_8 = 0xDF;
    private const int VK_OEM_AX = 0xE1;
    private const int VK_OEM_102 = 0xE2;
    private const int VK_ICO_HELP = 0xE3;
    private const int VK_ICO_00= 0xE4;
    private const int VK_PROCESSKEY = 0xE5;
    private const int VK_ICO_CLEAR = 0xE6;
    private const int VK_PACKET = 0xE7;
    private const int VK_OEM_RESET = 0xE9;
    private const int VK_OEM_JUMP = 0xEA;
    private const int VK_OEM_PA1 = 0xEB;
    private const int VK_OEM_PA2 = 0xEC;
    private const int VK_OEM_PA3 = 0xED;
    private const int VK_OEM_WSCTRL = 0xEE;
    private const int VK_OEM_CUSEL = 0xEF;
    private const int VK_OEM_ATTN = 0xF0;
    private const int VK_OEM_FINISH = 0xF1;
    private const int VK_OEM_COPY = 0xF2;
    private const int VK_OEM_AUTO = 0xF3;
    private const int VK_OEM_ENLW = 0xF4;
    private const int VK_OEM_BACKTAB = 0xF5;
    private const int VK_ATTN = 0xF6;
    private const int VK_CRSEL = 0xF7;
    private const int VK_EXSEL = 0xF8;
    private const int VK_EREOF = 0xF9;
    private const int VK_PLAY = 0xFA;
    private const int VK_ZOOM = 0xFB;
    private const int VK_NONAME = 0xFC;
    private const int VK_PA1 = 0xFD;
    private const int VK_OEM_CLEAR = 0xFE;
}