첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
------------------------------------------------------------------------------------------------------------------------------------------------------
728x90
728x170

TestProject.zip
다운로드

▶ ScanCode.cs

namespace TestProject
{
    /// <summary>
    /// 스캔 코드
    /// </summary>
    public enum ScanCode : short
    {
        /// <summary>
        /// LBUTTON
        /// </summary>
        LBUTTON = 0,

        /// <summary>
        /// RBUTTON
        /// </summary>
        RBUTTON = 0,

        /// <summary>
        /// CANCEL
        /// </summary>
        CANCEL = 70,

        /// <summary>
        /// MBUTTON
        /// </summary>
        MBUTTON = 0,

        /// <summary>
        /// XBUTTON1
        /// </summary>
        XBUTTON1 = 0,

        /// <summary>
        /// XBUTTON2
        /// </summary>
        XBUTTON2 = 0,

        /// <summary>
        /// BACK
        /// </summary>
        BACK = 14,

        /// <summary>
        /// TAB
        /// </summary>
        TAB = 15,

        /// <summary>
        /// CLEAR
        /// </summary>
        CLEAR = 76,

        /// <summary>
        /// RETURN
        /// </summary>
        RETURN = 28,

        /// <summary>
        /// SHIFT
        /// </summary>
        SHIFT = 42,

        /// <summary>
        /// CONTROL
        /// </summary>
        CONTROL = 29,

        /// <summary>
        /// MENU
        /// </summary>
        MENU = 56,

        /// <summary>
        /// PAUSE
        /// </summary>
        PAUSE = 0,

        /// <summary>
        /// CAPITAL
        /// </summary>
        CAPITAL = 58,

        /// <summary>
        /// KANA
        /// </summary>
        KANA = 0,

        /// <summary>
        /// HANGUL
        /// </summary>
        HANGUL = 0,

        /// <summary>
        /// JUNJA
        /// </summary>
        JUNJA = 0,

        /// <summary>
        /// FINAL
        /// </summary>
        FINAL = 0,

        /// <summary>
        /// HANJA
        /// </summary>
        HANJA = 0,

        /// <summary>
        /// KANJI
        /// </summary>
        KANJI = 0,

        /// <summary>
        /// ESCAPE
        /// </summary>
        ESCAPE = 1,

        /// <summary>
        /// CONVERT
        /// </summary>
        CONVERT = 0,

        /// <summary>
        /// NONCONVERT
        /// </summary>
        NONCONVERT = 0,

        /// <summary>
        /// ACCEPT
        /// </summary>
        ACCEPT = 0,

        /// <summary>
        /// MODECHANGE
        /// </summary>
        MODECHANGE = 0,

        /// <summary>
        /// SPACE
        /// </summary>
        SPACE = 57,

        /// <summary>
        /// PRIOR
        /// </summary>
        PRIOR = 73,

        /// <summary>
        /// NEXT
        /// </summary>
        NEXT = 81,

        /// <summary>
        /// END
        /// </summary>
        END = 79,

        /// <summary>
        /// HOME
        /// </summary>
        HOME = 71,

        /// <summary>
        /// LEFT
        /// </summary>
        LEFT = 75,

        /// <summary>
        /// UP
        /// </summary>
        UP = 72,

        /// <summary>
        /// RIGHT
        /// </summary>
        RIGHT = 77,

        /// <summary>
        /// DOWN
        /// </summary>
        DOWN = 80,

        /// <summary>
        /// SELECT
        /// </summary>
        SELECT = 0,

        /// <summary>
        /// PRINT
        /// </summary>
        PRINT = 0,

        /// <summary>
        /// EXECUTE
        /// </summary>
        EXECUTE = 0,

        /// <summary>
        /// SNAPSHOT
        /// </summary>
        SNAPSHOT = 84,

        /// <summary>
        /// INSERT
        /// </summary>
        INSERT = 82,

        /// <summary>
        /// DELETE
        /// </summary>
        DELETE = 83,

        /// <summary>
        /// HELP
        /// </summary>
        HELP = 99,

        /// <summary>
        /// KEY_0
        /// </summary>
        KEY_0 = 11,

        /// <summary>
        /// KEY_1
        /// </summary>
        KEY_1 = 2,

        /// <summary>
        /// KEY_2
        /// </summary>
        KEY_2 = 3,

        /// <summary>
        /// KEY_3
        /// </summary>
        KEY_3 = 4,

        /// <summary>
        /// KEY_4
        /// </summary>
        KEY_4 = 5,

        /// <summary>
        /// KEY_5
        /// </summary>
        KEY_5 = 6,

        /// <summary>
        /// KEY_6
        /// </summary>
        KEY_6 = 7,

        /// <summary>
        /// KEY_7
        /// </summary>
        KEY_7 = 8,

        /// <summary>
        /// KEY_8
        /// </summary>
        KEY_8 = 9,

        /// <summary>
        /// KEY_9
        /// </summary>
        KEY_9 = 10,

        /// <summary>
        /// KEY_A
        /// </summary>
        KEY_A = 30,

        /// <summary>
        /// KEY_B
        /// </summary>
        KEY_B = 48,

        /// <summary>
        /// KEY_C
        /// </summary>
        KEY_C = 46,

        /// <summary>
        /// KEY_D
        /// </summary>
        KEY_D = 32,

        /// <summary>
        /// KEY_E
        /// </summary>
        KEY_E = 18,

        /// <summary>
        /// KEY_F
        /// </summary>
        KEY_F = 33,

        /// <summary>
        /// KEY_G
        /// </summary>
        KEY_G = 34,

        /// <summary>
        /// KEY_H
        /// </summary>
        KEY_H = 35,

        /// <summary>
        /// KEY_I
        /// </summary>
        KEY_I = 23,

        /// <summary>
        /// KEY_J
        /// </summary>
        KEY_J = 36,

        /// <summary>
        /// KEY_K
        /// </summary>
        KEY_K = 37,

        /// <summary>
        /// KEY_L
        /// </summary>
        KEY_L = 38,

        /// <summary>
        /// KEY_M
        /// </summary>
        KEY_M = 50,

        /// <summary>
        /// KEY_N
        /// </summary>
        KEY_N = 49,

        /// <summary>
        /// KEY_O
        /// </summary>
        KEY_O = 24,

        /// <summary>
        /// KEY_P
        /// </summary>
        KEY_P = 25,

        /// <summary>
        /// KEY_Q
        /// </summary>
        KEY_Q = 16,

        /// <summary>
        /// KEY_R
        /// </summary>
        KEY_R = 19,

        /// <summary>
        /// KEY_S
        /// </summary>
        KEY_S = 31,

        /// <summary>
        /// KEY_T
        /// </summary>
        KEY_T = 20,

        /// <summary>
        /// KEY_U
        /// </summary>
        KEY_U = 22,

        /// <summary>
        /// KEY_V
        /// </summary>
        KEY_V = 47,

        /// <summary>
        /// KEY_W
        /// </summary>
        KEY_W = 17,

        /// <summary>
        /// KEY_X
        /// </summary>
        KEY_X = 45,

        /// <summary>
        /// KEY_Y
        /// </summary>
        KEY_Y = 21,

        /// <summary>
        /// KEY_Z
        /// </summary>
        KEY_Z = 44,

        /// <summary>
        /// LWIN
        /// </summary>
        LWIN = 91,

        /// <summary>
        /// RWIN
        /// </summary>
        RWIN = 92,

        /// <summary>
        /// APPS
        /// </summary>
        APPS = 93,

        /// <summary>
        /// SLEEP
        /// </summary>
        SLEEP = 95,

        /// <summary>
        /// NUMPAD0
        /// </summary>
        NUMPAD0 = 82,

        /// <summary>
        /// NUMPAD1
        /// </summary>
        NUMPAD1 = 79,

        /// <summary>
        /// NUMPAD2
        /// </summary>
        NUMPAD2 = 80,

        /// <summary>
        /// NUMPAD3
        /// </summary>
        NUMPAD3 = 81,

        /// <summary>
        /// NUMPAD4
        /// </summary>
        NUMPAD4 = 75,

        /// <summary>
        /// NUMPAD5
        /// </summary>
        NUMPAD5 = 76,

        /// <summary>
        /// NUMPAD6
        /// </summary>
        NUMPAD6 = 77,

        /// <summary>
        /// NUMPAD7
        /// </summary>
        NUMPAD7 = 71,

        /// <summary>
        /// NUMPAD8
        /// </summary>
        NUMPAD8 = 72,

        /// <summary>
        /// NUMPAD9
        /// </summary>
        NUMPAD9 = 73,

        /// <summary>
        /// MULTIPLY
        /// </summary>
        MULTIPLY = 55,

        /// <summary>
        /// ADD
        /// </summary>
        ADD = 78,

        /// <summary>
        /// SEPARATOR
        /// </summary>
        SEPARATOR = 0,

        /// <summary>
        /// SUBTRACT
        /// </summary>
        SUBTRACT = 74,

        /// <summary>
        /// DECIMAL
        /// </summary>
        DECIMAL = 83,

        /// <summary>
        /// DIVIDE
        /// </summary>
        DIVIDE = 53,

        /// <summary>
        /// F1
        /// </summary>
        F1 = 59,

        /// <summary>
        /// F2
        /// </summary>
        F2 = 60,

        /// <summary>
        /// F3
        /// </summary>
        F3 = 61,

        /// <summary>
        /// F4
        /// </summary>
        F4 = 62,

        /// <summary>
        /// F5
        /// </summary>
        F5 = 63,

        /// <summary>
        /// F6
        /// </summary>
        F6 = 64,

        /// <summary>
        /// F7
        /// </summary>
        F7 = 65,

        /// <summary>
        /// F8
        /// </summary>
        F8 = 66,

        /// <summary>
        /// F9
        /// </summary>
        F9 = 67,

        /// <summary>
        /// F10
        /// </summary>
        F10 = 68,

        /// <summary>
        /// F11
        /// </summary>
        F11 = 87,

        /// <summary>
        /// F12
        /// </summary>
        F12 = 88,

        /// <summary>
        /// F13
        /// </summary>
        F13 = 100,

        /// <summary>
        /// F14
        /// </summary>
        F14 = 101,

        /// <summary>
        /// F15
        /// </summary>
        F15 = 102,

        /// <summary>
        /// F16
        /// </summary>
        F16 = 103,

        /// <summary>
        /// F17
        /// </summary>
        F17 = 104,

        /// <summary>
        /// F18
        /// </summary>
        F18 = 105,

        /// <summary>
        /// F19
        /// </summary>
        F19 = 106,

        /// <summary>
        /// F20
        /// </summary>
        F20 = 107,

        /// <summary>
        /// F21
        /// </summary>
        F21 = 108,

        /// <summary>
        /// F22
        /// </summary>
        F22 = 109,

        /// <summary>
        /// F23
        /// </summary>
        F23 = 110,

        /// <summary>
        /// F24
        /// </summary>
        F24 = 118,

        /// <summary>
        /// NUMLOCK
        /// </summary>
        NUMLOCK = 69,

        /// <summary>
        /// SCROLL
        /// </summary>
        SCROLL = 70,

        /// <summary>
        /// LSHIFT
        /// </summary>
        LSHIFT = 42,

        /// <summary>
        /// RSHIFT
        /// </summary>
        RSHIFT = 54,

        /// <summary>
        /// LCONTROL
        /// </summary>
        LCONTROL = 29,

        /// <summary>
        /// RCONTROL
        /// </summary>
        RCONTROL = 29,

        /// <summary>
        /// LMENU
        /// </summary>
        LMENU = 56,

        /// <summary>
        /// RMENU
        /// </summary>
        RMENU = 56,

        /// <summary>
        /// BROWSER_BACK
        /// </summary>
        BROWSER_BACK = 106,

        /// <summary>
        /// BROWSER_FORWARD
        /// </summary>
        BROWSER_FORWARD = 105,

        /// <summary>
        /// BROWSER_REFRESH
        /// </summary>
        BROWSER_REFRESH = 103,

        /// <summary>
        /// BROWSER_STOP
        /// </summary>
        BROWSER_STOP = 104,

        /// <summary>
        /// BROWSER_SEARCH
        /// </summary>
        BROWSER_SEARCH = 101,

        /// <summary>
        /// BROWSER_FAVORITES
        /// </summary>
        BROWSER_FAVORITES = 102,

        /// <summary>
        /// BROWSER_HOME
        /// </summary>
        BROWSER_HOME = 50,

        /// <summary>
        /// VOLUME_MUTE
        /// </summary>
        VOLUME_MUTE = 32,

        /// <summary>
        /// VOLUME_DOWN
        /// </summary>
        VOLUME_DOWN = 46,

        /// <summary>
        /// VOLUME_UP
        /// </summary>
        VOLUME_UP = 48,

        /// <summary>
        /// MEDIA_NEXT_TRACK
        /// </summary>
        MEDIA_NEXT_TRACK = 25,

        /// <summary>
        /// MEDIA_PREV_TRACK
        /// </summary>
        MEDIA_PREV_TRACK = 16,

        /// <summary>
        /// MEDIA_STOP
        /// </summary>
        MEDIA_STOP = 36,

        /// <summary>
        /// MEDIA_PLAY_PAUSE
        /// </summary>
        MEDIA_PLAY_PAUSE = 34,

        /// <summary>
        /// LAUNCH_MAIL
        /// </summary>
        LAUNCH_MAIL = 108,

        /// <summary>
        /// LAUNCH_MEDIA_SELECT
        /// </summary>
        LAUNCH_MEDIA_SELECT = 109,

        /// <summary>
        /// LAUNCH_APP1
        /// </summary>
        LAUNCH_APP1 = 107,

        /// <summary>
        /// LAUNCH_APP2
        /// </summary>
        LAUNCH_APP2 = 33,

        /// <summary>
        /// OEM_1
        /// </summary>
        OEM_1 = 39,

        /// <summary>
        /// OEM_PLUS
        /// </summary>
        OEM_PLUS = 13,

        /// <summary>
        /// OEM_COMMA
        /// </summary>
        OEM_COMMA = 51,

        /// <summary>
        /// OEM_MINUS
        /// </summary>
        OEM_MINUS = 12,

        /// <summary>
        /// OEM_PERIOD
        /// </summary>
        OEM_PERIOD = 52,

        /// <summary>
        /// OEM_2
        /// </summary>
        OEM_2 = 53,

        /// <summary>
        /// OEM_3
        /// </summary>
        OEM_3 = 41,

        /// <summary>
        /// OEM_4
        /// </summary>
        OEM_4 = 26,

        /// <summary>
        /// OEM_5
        /// </summary>
        OEM_5 = 43,

        /// <summary>
        /// OEM_6
        /// </summary>
        OEM_6 = 27,

        /// <summary>
        /// OEM_7
        /// </summary>
        OEM_7 = 40,

        /// <summary>
        /// OEM_8
        /// </summary>
        OEM_8 = 0,

        /// <summary>
        /// OEM_102
        /// </summary>
        OEM_102 = 86,

        /// <summary>
        /// PROCESSKEY
        /// </summary>
        PROCESSKEY = 0,

        /// <summary>
        /// PACKET
        /// </summary>
        PACKET = 0,

        /// <summary>
        /// ATTN
        /// </summary>
        ATTN = 0,

        /// <summary>
        /// CRSEL
        /// </summary>
        CRSEL = 0,

        /// <summary>
        /// EXSEL
        /// </summary>
        EXSEL = 0,

        /// <summary>
        /// EREOF
        /// </summary>
        EREOF = 93,

        /// <summary>
        /// PLAY
        /// </summary>
        PLAY = 0,

        /// <summary>
        /// ZOOM
        /// </summary>
        ZOOM = 98,

        /// <summary>
        /// NONAME
        /// </summary>
        NONAME = 0,

        /// <summary>
        /// PA1
        /// </summary>
        PA1 = 0,

        /// <summary>
        /// OEM_CLEAR
        /// </summary>
        OEM_CLEAR = 0
    }
}

 

728x90

 

▶ VirtualKey.cs

namespace TestProject
{
    /// <summary>
    /// 가상 키
    /// </summary>
    public enum VirtualKey : short
    {
        ///<summary>
        /// Left mouse button
        ///</summary>
        LBUTTON = 0x01,

        ///<summary>
        /// Right mouse button
        ///</summary>
        RBUTTON = 0x02,

        ///<summary>
        /// Control-break processing
        ///</summary>
        CANCEL = 0x03,

        ///<summary>
        /// Middle mouse button (Three-button mouse)
        ///</summary>
        MBUTTON = 0x04,

        ///<summary>
        /// Windows 2000/XP : X1 mouse button
        ///</summary>
        XBUTTON1 = 0x05,

        ///<summary>
        /// Windows 2000/XP : X2 mouse button
        ///</summary>
        XBUTTON2 = 0x06,

        ///<summary>
        /// BACKSPACE key
        ///</summary>
        BACK = 0x08,

        ///<summary>
        /// TAB key
        ///</summary>
        TAB = 0x09,

        ///<summary>
        /// CLEAR key
        ///</summary>
        CLEAR = 0x0C,

        ///<summary>
        /// ENTER key
        ///</summary>
        RETURN = 0x0D,

        ///<summary>
        /// SHIFT key
        ///</summary>
        SHIFT = 0x10,

        ///<summary>
        /// CTRL key
        ///</summary>
        CONTROL = 0x11,

        ///<summary>
        /// ALT key
        ///</summary>
        MENU = 0x12,

        ///<summary>
        /// PAUSE key
        ///</summary>
        PAUSE = 0x13,

        ///<summary>
        /// CAPS LOCK key
        ///</summary>
        CAPITAL = 0x14,

        ///<summary>
        /// Input Method Editor (IME) Kana mode
        ///</summary>
        KANA = 0x15,

        ///<summary>
        /// IME Hangul mode
        ///</summary>
        HANGUL = 0x15,

        ///<summary>
        /// IME Junja mode
        ///</summary>
        JUNJA = 0x17,

        ///<summary>
        /// IME final mode
        ///</summary>
        FINAL = 0x18,

        ///<summary>
        /// IME Hanja mode
        ///</summary>
        HANJA = 0x19,

        ///<summary>
        /// IME Kanji mode
        ///</summary>
        KANJI = 0x19,

        ///<summary>
        /// ESC key
        ///</summary>
        ESCAPE = 0x1B,

        ///<summary>
        /// IME convert
        ///</summary>
        CONVERT = 0x1C,

        ///<summary>
        /// IME nonconvert
        ///</summary>
        NONCONVERT = 0x1D,

        ///<summary>
        /// IME accept
        ///</summary>
        ACCEPT = 0x1E,

        ///<summary>
        /// IME mode change request
        ///</summary>
        MODECHANGE = 0x1F,

        ///<summary>
        /// SPACEBAR
        ///</summary>
        SPACE = 0x20,

        ///<summary>
        /// PAGE UP key
        ///</summary>
        PRIOR = 0x21,

        ///<summary>
        /// PAGE DOWN key
        ///</summary>
        NEXT = 0x22,

        ///<summary>
        /// END key
        ///</summary>
        END = 0x23,

        ///<summary>
        /// HOME key
        ///</summary>
        HOME = 0x24,

        ///<summary>
        /// LEFT ARROW key
        ///</summary>
        LEFT = 0x25,

        ///<summary>
        /// UP ARROW key
        ///</summary>
        UP = 0x26,

        ///<summary>
        /// RIGHT ARROW key
        ///</summary>
        RIGHT = 0x27,

        ///<summary>
        /// DOWN ARROW key
        ///</summary>
        DOWN = 0x28,

        ///<summary>
        /// SELECT key
        ///</summary>
        SELECT = 0x29,

        ///<summary>
        /// PRINT key
        ///</summary>
        PRINT = 0x2A,

        ///<summary>
        /// EXECUTE key
        ///</summary>
        EXECUTE = 0x2B,

        ///<summary>
        /// PRINT SCREEN key
        ///</summary>
        SNAPSHOT = 0x2C,

        ///<summary>
        /// INS key
        ///</summary>
        INSERT = 0x2D,

        ///<summary>
        /// DEL key
        ///</summary>
        DELETE = 0x2E,

        ///<summary>
        /// HELP key
        ///</summary>
        HELP = 0x2F,

        ///<summary>
        /// 0 key
        ///</summary>
        KEY_0 = 0x30,

        ///<summary>
        /// 1 key
        ///</summary>
        KEY_1 = 0x31,

        ///<summary>
        /// 2 key
        ///</summary>
        KEY_2 = 0x32,

        ///<summary>
        /// 3 key
        ///</summary>
        KEY_3 = 0x33,

        ///<summary>
        /// 4 key
        ///</summary>
        KEY_4 = 0x34,

        ///<summary>
        /// 5 key
        ///</summary>
        KEY_5 = 0x35,

        ///<summary>
        /// 6 key
        ///</summary>
        KEY_6 = 0x36,

        ///<summary>
        /// 7 key
        ///</summary>
        KEY_7 = 0x37,

        ///<summary>
        /// 8 key
        ///</summary>
        KEY_8 = 0x38,

        ///<summary>
        /// 9 key
        ///</summary>
        KEY_9 = 0x39,

        ///<summary>
        /// A key
        ///</summary>
        KEY_A = 0x41,

        ///<summary>
        /// B key
        ///</summary>
        KEY_B = 0x42,

        ///<summary>
        /// C key
        ///</summary>
        KEY_C = 0x43,

        ///<summary>
        /// D key
        ///</summary>
        KEY_D = 0x44,

        ///<summary>
        /// E key
        ///</summary>
        KEY_E = 0x45,

        ///<summary>
        /// F key
        ///</summary>
        KEY_F = 0x46,

        ///<summary>
        /// G key
        ///</summary>
        KEY_G = 0x47,

        ///<summary>
        /// H key
        ///</summary>
        KEY_H = 0x48,

        ///<summary>
        /// I key
        ///</summary>
        KEY_I = 0x49,

        ///<summary>
        /// J key
        ///</summary>
        KEY_J = 0x4A,

        ///<summary>
        /// K key
        ///</summary>
        KEY_K = 0x4B,

        ///<summary>
        /// L key
        ///</summary>
        KEY_L = 0x4C,

        ///<summary>
        /// M key
        ///</summary>
        KEY_M = 0x4D,

        ///<summary>
        /// N key
        ///</summary>
        KEY_N = 0x4E,

        ///<summary>
        /// O key
        ///</summary>
        KEY_O = 0x4F,

        ///<summary>
        /// P key
        ///</summary>
        KEY_P = 0x50,

        ///<summary>
        /// Q key
        ///</summary>
        KEY_Q = 0x51,

        ///<summary>
        /// R key
        ///</summary>
        KEY_R = 0x52,

        ///<summary>
        /// S key
        ///</summary>
        KEY_S = 0x53,

        ///<summary>
        /// T key
        ///</summary>
        KEY_T = 0x54,

        ///<summary>
        /// U key
        ///</summary>
        KEY_U = 0x55,

        ///<summary>
        /// V key
        ///</summary>
        KEY_V = 0x56,

        ///<summary>
        /// W key
        ///</summary>
        KEY_W = 0x57,

        ///<summary>
        /// X key
        ///</summary>
        KEY_X = 0x58,

        ///<summary>
        /// Y key
        ///</summary>
        KEY_Y = 0x59,

        ///<summary>
        /// Z key
        ///</summary>
        KEY_Z = 0x5A,

        ///<summary>
        /// Left Windows key (Microsoft Natural keyboard)
        ///</summary>
        LWIN = 0x5B,

        ///<summary>
        /// Right Windows key (Natural keyboard)
        ///</summary>
        RWIN = 0x5C,

        ///<summary>
        /// Applications key (Natural keyboard)
        ///</summary>
        APPS = 0x5D,

        ///<summary>
        /// Computer Sleep key
        ///</summary>
        SLEEP = 0x5F,

        ///<summary>
        /// Numeric keypad 0 key
        ///</summary>
        NUMPAD0 = 0x60,

        ///<summary>
        /// Numeric keypad 1 key
        ///</summary>
        NUMPAD1 = 0x61,

        ///<summary>
        /// Numeric keypad 2 key
        ///</summary>
        NUMPAD2 = 0x62,

        ///<summary>
        /// Numeric keypad 3 key
        ///</summary>
        NUMPAD3 = 0x63,

        ///<summary>
        /// Numeric keypad 4 key
        ///</summary>
        NUMPAD4 = 0x64,

        ///<summary>
        /// Numeric keypad 5 key
        ///</summary>
        NUMPAD5 = 0x65,

        ///<summary>
        /// Numeric keypad 6 key
        ///</summary>
        NUMPAD6 = 0x66,

        ///<summary>
        /// Numeric keypad 7 key
        ///</summary>
        NUMPAD7 = 0x67,

        ///<summary>
        /// Numeric keypad 8 key
        ///</summary>
        NUMPAD8 = 0x68,

        ///<summary>
        /// Numeric keypad 9 key
        ///</summary>
        NUMPAD9 = 0x69,

        ///<summary>
        /// Multiply key
        ///</summary>
        MULTIPLY = 0x6A,

        ///<summary>
        /// Add key
        ///</summary>
        ADD = 0x6B,

        ///<summary>
        /// Separator key
        ///</summary>
        SEPARATOR = 0x6C,

        ///<summary>
        /// Subtract key
        ///</summary>
        SUBTRACT = 0x6D,

        ///<summary>
        /// Decimal key
        ///</summary>
        DECIMAL = 0x6E,

        ///<summary>
        /// Divide key
        ///</summary>
        DIVIDE = 0x6F,

        ///<summary>
        /// F1 key
        ///</summary>
        F1 = 0x70,

        ///<summary>
        /// F2 key
        ///</summary>
        F2 = 0x71,

        ///<summary>
        /// F3 key
        ///</summary>
        F3 = 0x72,

        ///<summary>
        /// F4 key
        ///</summary>
        F4 = 0x73,

        ///<summary>
        /// F5 key
        ///</summary>
        F5 = 0x74,

        ///<summary>
        /// F6 key
        ///</summary>
        F6 = 0x75,

        ///<summary>
        /// F7 key
        ///</summary>
        F7 = 0x76,

        ///<summary>
        /// F8 key
        ///</summary>
        F8 = 0x77,

        ///<summary>
        /// F9 key
        ///</summary>
        F9 = 0x78,

        ///<summary>
        /// F10 key
        ///</summary>
        F10 = 0x79,

        ///<summary>
        /// F11 key
        ///</summary>
        F11 = 0x7A,

        ///<summary>
        /// F12 key
        ///</summary>
        F12 = 0x7B,

        ///<summary>
        /// F13 key
        ///</summary>
        F13 = 0x7C,

        ///<summary>
        /// F14 key
        ///</summary>
        F14 = 0x7D,

        ///<summary>
        /// F15 key
        ///</summary>
        F15 = 0x7E,

        ///<summary>
        /// F16 key
        ///</summary>
        F16 = 0x7F,

        ///<summary>
        /// F17 key  
        ///</summary>
        F17 = 0x80,

        ///<summary>
        /// F18 key  
        ///</summary>
        F18 = 0x81,

        ///<summary>
        /// F19 key  
        ///</summary>
        F19 = 0x82,

        ///<summary>
        /// F20 key  
        ///</summary>
        F20 = 0x83,

        ///<summary>
        /// F21 key  
        ///</summary>
        F21 = 0x84,

        ///<summary>
        /// F22 key, (PPC only) Key used to lock device.
        ///</summary>
        F22 = 0x85,

        ///<summary>
        /// F23 key  
        ///</summary>
        F23 = 0x86,

        ///<summary>
        /// F24 key  
        ///</summary>
        F24 = 0x87,

        ///<summary>
        /// NUM LOCK key
        ///</summary>
        NUMLOCK = 0x90,

        ///<summary>
        /// SCROLL LOCK key
        ///</summary>
        SCROLL = 0x91,

        ///<summary>
        /// Left SHIFT key
        ///</summary>
        LSHIFT = 0xA0,

        ///<summary>
        /// Right SHIFT key
        ///</summary>
        RSHIFT = 0xA1,

        ///<summary>
        /// Left CONTROL key
        ///</summary>
        LCONTROL = 0xA2,

        ///<summary>
        /// Right CONTROL key
        ///</summary>
        RCONTROL = 0xA3,

        ///<summary>
        /// Left MENU key
        ///</summary>
        LMENU = 0xA4,

        ///<summary>
        /// Right MENU key
        ///</summary>
        RMENU = 0xA5,

        ///<summary>
        /// Windows 2000/XP : Browser Back key
        ///</summary>
        BROWSER_BACK = 0xA6,

        ///<summary>
        /// Windows 2000/XP : Browser Forward key
        ///</summary>
        BROWSER_FORWARD = 0xA7,

        ///<summary>
        /// Windows 2000/XP : Browser Refresh key
        ///</summary>
        BROWSER_REFRESH = 0xA8,

        ///<summary>
        /// Windows 2000/XP : Browser Stop key
        ///</summary>
        BROWSER_STOP = 0xA9,

        ///<summary>
        /// Windows 2000/XP : Browser Search key
        ///</summary>
        BROWSER_SEARCH = 0xAA,

        ///<summary>
        /// Windows 2000/XP : Browser Favorites key
        ///</summary>
        BROWSER_FAVORITES = 0xAB,

        ///<summary>
        /// Windows 2000/XP : Browser Start and Home key
        ///</summary>
        BROWSER_HOME = 0xAC,

        ///<summary>
        /// Windows 2000/XP : Volume Mute key
        ///</summary>
        VOLUME_MUTE = 0xAD,

        ///<summary>
        /// Windows 2000/XP : Volume Down key
        ///</summary>
        VOLUME_DOWN = 0xAE,

        ///<summary>
        /// Windows 2000/XP : Volume Up key
        ///</summary>
        VOLUME_UP = 0xAF,

        ///<summary>
        /// Windows 2000/XP : Next Track key
        ///</summary>
        MEDIA_NEXT_TRACK = 0xB0,

        ///<summary>
        /// Windows 2000/XP : Previous Track key
        ///</summary>
        MEDIA_PREV_TRACK = 0xB1,

        ///<summary>
        /// Windows 2000/XP : Stop Media key
        ///</summary>
        MEDIA_STOP = 0xB2,

        ///<summary>
        /// Windows 2000/XP : Play/Pause Media key
        ///</summary>
        MEDIA_PLAY_PAUSE = 0xB3,

        ///<summary>
        /// Windows 2000/XP : Start Mail key
        ///</summary>
        LAUNCH_MAIL = 0xB4,

        ///<summary>
        /// Windows 2000/XP : Select Media key
        ///</summary>
        LAUNCH_MEDIA_SELECT = 0xB5,

        ///<summary>
        /// Windows 2000/XP : Start Application 1 key
        ///</summary>
        LAUNCH_APP1 = 0xB6,

        ///<summary>
        /// Windows 2000/XP : Start Application 2 key
        ///</summary>
        LAUNCH_APP2 = 0xB7,

        ///<summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        ///</summary>
        OEM_1 = 0xBA,

        ///<summary>
        /// Windows 2000/XP : For any country/region, the '+' key
        ///</summary>
        OEM_PLUS = 0xBB,

        ///<summary>
        /// Windows 2000/XP : For any country/region, the ',' key
        ///</summary>
        OEM_COMMA = 0xBC,

        ///<summary>
        /// Windows 2000/XP : For any country/region, the '-' key
        ///</summary>
        OEM_MINUS = 0xBD,

        ///<summary>
        /// Windows 2000/XP : For any country/region, the '.' key
        ///</summary>
        OEM_PERIOD = 0xBE,

        ///<summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        ///</summary>
        OEM_2 = 0xBF,

        ///<summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        ///</summary>
        OEM_3 = 0xC0,

        ///<summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        ///</summary>
        OEM_4 = 0xDB,

        ///<summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        ///</summary>
        OEM_5 = 0xDC,

        ///<summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        ///</summary>
        OEM_6 = 0xDD,

        ///<summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        ///</summary>
        OEM_7 = 0xDE,

        ///<summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        ///</summary>
        OEM_8 = 0xDF,

        ///<summary>
        /// Windows 2000/XP : Either the angle bracket key or the backslash key on the RT 102-key keyboard
        ///</summary>
        OEM_102 = 0xE2,

        ///<summary>
        /// Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP : IME PROCESS key
        ///</summary>
        PROCESSKEY = 0xE5,

        ///<summary>
        /// Windows 2000/XP : Used to pass Unicode characters as if they were keystrokes.
        /// The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods.
        /// For more information,
        /// see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP
        ///</summary>
        PACKET = 0xE7,

        ///<summary>
        /// Attn key
        ///</summary>
        ATTN = 0xF6,

        ///<summary>
        /// CrSel key
        ///</summary>
        CRSEL = 0xF7,

        ///<summary>
        /// ExSel key
        ///</summary>
        EXSEL = 0xF8,

        ///<summary>
        /// Erase EOF key
        ///</summary>
        EREOF = 0xF9,

        ///<summary>
        /// Play key
        ///</summary>
        PLAY = 0xFA,

        ///<summary>
        /// Zoom key
        ///</summary>
        ZOOM = 0xFB,

        ///<summary>
        /// Reserved
        ///</summary>
        NONAME = 0xFC,

        ///<summary>
        /// PA1 key
        ///</summary>
        PA1 = 0xFD,

        ///<summary>
        /// Clear key
        ///</summary>
        OEM_CLEAR = 0xFE
    }
}

 

300x250

 

▶ KeyEventFlag.cs

using System;

namespace TestProject
{
    /// <summary>
    /// 키 이벤트 플래그
    /// </summary>
    [Flags]
    public enum KeyEventFlag : uint
    {
        /// <summary>
        /// 확장 키
        /// </summary>
        ExtendedKey = 0x0001,

        /// <summary>
        /// 키 UP
        /// </summary>
        KeyUp = 0x0002,

        /// <summary>
        /// 스캔 코드
        /// </summary>
        ScanCode = 0x0008,

        /// <summary>
        /// 유니코드
        /// </summary>
        Unicode = 0x0004
    }
}

 

▶ KeyboardInput.cs

using System;
using System.Runtime.InteropServices;

namespace TestProject
{
    [StructLayout(LayoutKind.Sequential)]
    public struct KeyboardInput
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region Field

        /// <summary>
        /// 가상 키
        /// </summary>
        public VirtualKey VirtualKey;

        /// <summary>
        /// 스캔 코드
        /// </summary>
        public short ScanCode;

        /// <summary>
        /// 플래그
        /// </summary>
        public KeyEventFlag Flag;

        /// <summary>
        /// 시간
        /// </summary>
        public int Time;

        /// <summary>
        /// 부가 정보
        /// </summary>
        public UIntPtr ExtraInformation;

        #endregion
    }
}

 

▶ MouseEventFlag.cs

using System;

namespace TestProject
{
    /// <summary>
    /// 마우스 이벤트 플래그
    /// </summary>
    [Flags]
    public enum MouseEventFlag : uint
    {
        /// <summary>
        /// DX 및 DY 매개 변수 절대 좌표
        /// </summary>
        Absolute = 0x8000,

        /// <summary>
        /// 휠 기울기 여부
        /// </summary>
        HWheel = 0x01000,

        /// <summary>
        /// 이동
        /// </summary>
        Move = 0x0001,

        /// <summary>
        /// Move No Coalesce
        /// </summary>
        MoveNoCoalesce = 0x2000,

        /// <summary>
        /// 왼쪽 버튼 DOWN
        /// </summary>
        LeftDown = 0x0002,

        /// <summary>
        /// 왼쪽 버튼 UP
        /// </summary>
        LeftUp = 0x0004,

        /// <summary>
        /// 오른쪽 버튼 DOWN
        /// </summary>
        RightDown = 0x0008,

        /// <summary>
        /// 오른쪽 버튼 UP
        /// </summary>
        RightUp = 0x0010,

        /// <summary>
        /// 가운데 버튼 DOWN
        /// </summary>
        MiddleDown = 0x0020,

        /// <summary>
        /// 가운데 버튼 UP
        /// </summary>
        MiddleUp = 0x0040,

        /// <summary>
        /// 가상 데스크
        /// </summary>
        VirtualDesk = 0x4000,

        /// <summary>
        /// 마우스 휠
        /// </summary>
        Wheel = 0x0800,

        /// <summary>
        /// X 버튼 DOWN
        /// </summary>
        XDown = 0x0080,

        /// <summary>
        /// X 버튼 UP
        /// </summary>
        XUp = 0x0100
    }
}

 

▶ MouseInput.cs

using System;
using System.Runtime.InteropServices;

namespace TestProject
{
    /// <summary>
    /// 마우스 입력
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public struct MouseInput
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region Field

        /// <summary>
        /// 델타 X
        /// </summary>
        public int DeltaX;

        /// <summary>
        /// 델타 Y
        /// </summary>
        public int DeltaY;

        /// <summary>
        /// 마우스 데이터
        /// </summary>
        public int MouseData;

        /// <summary>
        /// 플래그
        /// </summary>
        public MouseEventFlag Flag;

        /// <summary>
        /// 시간
        /// </summary>
        public uint Time;

        /// <summary>
        /// 부가 정보
        /// </summary>
        public UIntPtr ExtraInformation;

        #endregion
    }
}

 

▶ HardwareInput.cs

using System.Runtime.InteropServices;

namespace TestProject
{
    /// <summary>
    /// 하드웨어 입력
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public struct HardwareInput
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region Field

        /// <summary>
        /// 메시지
        /// </summary>
        public int Message;

        /// <summary>
        /// WORD 매개 변수 LOW
        /// </summary>
        public short WordParameterLow;

        /// <summary>
        /// WORD 매개 변수 HIGH
        /// </summary>
        public short WordParameterHigh;

        #endregion
    }
}

 

▶ InputUnion.cs

using System.Runtime.InteropServices;

namespace TestProject
{
    /// <summary>
    /// 입력 유니온
    /// </summary>
    [StructLayout(LayoutKind.Explicit)]
    public struct InputUnion
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region Field

        /// <summary>
        /// 마우스 입력
        /// </summary>
        [FieldOffset(0)]
        public MouseInput MouseInput;

        /// <summary>
        /// 키보드 입력
        /// </summary>
        [FieldOffset(0)]
        public KeyboardInput KeyboardInput;

        /// <summary>
        /// 하드웨어 입력
        /// </summary>
        [FieldOffset(0)]
        public HardwareInput HardwareInput;

        #endregion
    }
}

 

▶ InputType.cs

namespace TestProject
{
    /// <summary>
    /// 입력 타입
    /// </summary>
    public enum InputType : uint
    {
        /// <summary>
        /// 마우스
        /// </summary>
        Mouse = 0,

        /// <summary>
        /// 키보드
        /// </summary>
        Keyboard = 1,

        /// <summary>
        /// 하드웨어
        /// </summary>
        Hardware = 2,
    }
}

 

▶ Input.cs

using System.Runtime.InteropServices;

namespace TestProject
{
    /// <summary>
    /// 입력
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public struct Input
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region Field

        /// <summary>
        /// 입력 타입
        /// </summary>
        public InputType InputType;

        /// <summary>
        /// 입력 유니온
        /// </summary>
        public InputUnion InputUnion;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 크기 - Size

        /// <summary>
        /// 크기
        /// </summary>
        public static int Size
        {
            get
            {
                return Marshal.SizeOf(typeof(Input));
            }
        }

        #endregion
    }
}

 

▶ WIN32Helper.cs

using System;
using System.Runtime.InteropServices;

namespace TestProject
{
    /// <summary>
    /// WIN32 헬퍼
    /// </summary>
    public static class WIN32Helper
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Public

        #region 입력 보내기 - SendInput(inputArrayLength, inputArray, size)

        /// <summary>
        /// 입력 보내기
        /// </summary>
        /// <param name="inputArrayLength">입력 배열 길이</param>
        /// <param name="inputArray">입력 배열</param>
        /// <param name="size">크기</param>
        /// <returns>처리 결과</returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern uint SendInput
        (
            uint                                           inputArrayLength,
            [MarshalAs(UnmanagedType.LPArray), In] Input[] inputArray,
            int                                            size
        );

        #endregion
        #region 메시지 부가 정보 구하기 - GetMessageExtraInfo()

        /// <summary>
        /// 메시지 부가 정보 구하기
        /// </summary>
        /// <returns>메시지 부가 정보 핸들</returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern UIntPtr GetMessageExtraInfo();

        #endregion
        #region 윈도우 찾기 - FindWindow(className, windowName)

        /// <summary>
        /// 윈도우 찾기
        /// </summary>
        /// <param name="className">클래스명</param>
        /// <param name="windowName">윈도우명</param>
        /// <returns>윈도우 핸들</returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindow(string className, string windowName);

        #endregion
        #region 윈도우 찾기 (확장) - FindWindowEx(parentWindowHandle, childAfterWindowHandle, className, windowText)

        /// <summary>
        /// 윈도우 찾기 (확장)
        /// </summary>
        /// <param name="parentWindowHandle">부모 윈도우 핸들</param>
        /// <param name="childAfterWindowHandle">찾기 이후 자식 윈도우 핸들</param>
        /// <param name="className">클래스명</param>
        /// <param name="windowText">윈도우 텍스트</param>
        /// <returns>윈도우 핸들</returns>
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindowEx
        (
            IntPtr parentWindowHandle,
            IntPtr childAfterWindowHandle,
            string className,
            string windowText
        );

        #endregion
        #region 전경 윈도우 설정하기 - SetForegroundWindow(windowHandle)

        /// <summary>
        /// 전경 윈도우 설정하기
        /// </summary>
        /// <param name="windowHandle">윈도우 핸들</param>
        /// <returns>처리 결과</returns>
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetForegroundWindow(IntPtr windowHandle);

        #endregion
        #region 활성 윈도우 구하기 - GetActiveWindow()

        /// <summary>
        /// 활성 윈도우 구하기
        /// </summary>
        /// <returns>활성 윈도우 핸들</returns>
        [DllImport("user32.dll")]
        public static extern IntPtr GetActiveWindow();

        #endregion
    }
}

 

▶ MessageHelper.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace TestProject
{
    /// <summary>
    /// 메시지 헬퍼
    /// </summary>
    public static class MessageHelper
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Public

        #region 문자열 보내기 - SendString(windowHandle, message)

        /// <summary>
        /// 문자열 보내기
        /// </summary>
        /// <param name="windowHandle">윈도우 핸들</param>
        /// <param name="message">메시지</param>
        /// <returns>처리 결과</returns>
        public static bool SendString(IntPtr windowHandle, string message)
        {
            if(string.IsNullOrEmpty(message))
            {
                return false;
            }

            WIN32Helper.SetForegroundWindow(windowHandle);

            List<Input> inputList = new List<Input>(message.Length);

            char? previousCharacter = null;

            for(int i = 0; i < message.Length; i++)
            {
                char currentCharacter = message[i];

                if(currentCharacter == previousCharacter)
                {
                    Input dummyInput = new Input();

                    dummyInput.InputType                           = InputType.Keyboard;
                    dummyInput.InputUnion.KeyboardInput.Flag       = KeyEventFlag.Unicode;
                    dummyInput.InputUnion.KeyboardInput.VirtualKey = 0;

                    unchecked
                    {
                        dummyInput.InputUnion.KeyboardInput.ScanCode = (short)0;
                    }

                    inputList.Add(dummyInput);
                }

                Input input = new Input();

                input.InputType                           = InputType.Keyboard;
                input.InputUnion.KeyboardInput.Flag       = KeyEventFlag.Unicode;
                input.InputUnion.KeyboardInput.VirtualKey = 0;

                unchecked
                {
                    input.InputUnion.KeyboardInput.ScanCode = (short)message[i];
                }

                inputList.Add(input);

                previousCharacter = currentCharacter;
            }

            Debug.WriteLine($"MessageHelper.SendString({windowHandle}, {message})");

            uint result = WIN32Helper.SendInput((uint)inputList.Count, inputList.ToArray(), Input.Size);

            if(result <= 0)
            {
                int errorCode = Marshal.GetLastWin32Error();

                Debug.WriteLine
                (
                    string.Format
                    (
                        "   Messaging.SendCharacter({0}, {1}) : Error {2} : {3}",
                        windowHandle,
                        message,
                        errorCode,
                        new Win32Exception(errorCode).Message
                    )
                );
            }

            return result > 0;
        }

        #endregion
        #region 문자열 보내기 - SendString(processName, message)

        /// <summary>
        /// 문자열 보내기
        /// </summary>
        /// <param name="processName">프로세스명</param>
        /// <param name="message">메시지</param>
        /// <returns>처리 결과</returns>
        public static bool SendString(string processName, string message)
        {
            if(string.IsNullOrEmpty(message))
            {
                return false;
            }

            IntPtr windowHandle;

            if(string.IsNullOrEmpty(processName))
            {
                windowHandle = WIN32Helper.GetActiveWindow();
            }
            else
            {
                windowHandle = WIN32Helper.FindWindow(processName, null);
            }

            if(windowHandle == IntPtr.Zero)
            {
                return false;
            }

            bool anySent = false;

            anySent = SendString(windowHandle, message);

            return anySent;
        }

        #endregion
        #region 문자열 보내기 - SendString(message)

        /// <summary>
        /// 문자열 보내기
        /// </summary>
        /// <param name="message">메시지</param>
        /// <returns>처리 결과</returns>
        public static bool SendString(string message)
        {
            return SendString(null, message);
        }

        #endregion
    }
}

 

▶ Program.cs

using System;
using System.Diagnostics;

namespace TestProject
{
    /// <summary>
    /// 프로그램
    /// </summary>
    class Program
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region 프로그램 시작하기 - Main()

        /// <summary>
        /// 프로그램 시작하기
        /// </summary>
        private static void Main()
        {
            Process process = new Process();

            process.StartInfo.FileName  = "notepad.exe"; 
            process.StartInfo.Arguments = null;

            process.Start(); 

            process.WaitForInputIdle(100);

            IntPtr mainWindowHandle = process.MainWindowHandle;

            IntPtr editWindowHandle = WIN32Helper.FindWindowEx(mainWindowHandle, IntPtr.Zero, "EDIT", null);

            MessageHelper.SendString(editWindowHandle, "테스트 문자열 입니다.");
        }

        #endregion
    }
}
728x90
그리드형(광고전용)
Posted by icodebroker
,