当前位置:编程学习 > C#/ASP.NET >>

求教调用WinIO模拟键盘,使用的枚举和命令参数

这个东西搜了半天,五花八门,但都不对……有的说普通键直接发,扩展键要发一个e0标志;也有的代码是统一先发一个e2/e0/60标志的,但不管怎么都不对,总会有弹不起来的情况。。
按说这种东西总觉得应该有个官方文档,文档又不说,文档只说函数用法,问题是该往函数里传什么天知道。。有这方面的文档链接么?
另外不会是枚举有问题吧。。枚举因为我要与System.Windows.Input里的Key枚举做转换,才改成了一致的名字,改对了没?
        private static void KBCWait4IBE()
        {
            System.Threading.Thread.Sleep(25);
            int dwVal = 0;
            do
            {
                bool flag = GetPortVal((IntPtr)KBC_KEY_CMD, out dwVal, 1);
            }
            while ((dwVal & 0x2) > 0);
            do
            {
                bool flag = GetPortVal((IntPtr)KBC_KEY_DATA, out dwVal, 1);
            }
            while ((dwVal & 0x2) > 0);
        }
        static bool ext_key = false;
        
        public static void KeyDown(Vk_Key vk_code) // 该发什么?
        {
            if (vk_code == Vk_Key.None)
                return;
            int btScancode = 0;
            btScancode = MapVirtualKey((byte)vk_code, 0);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);
            if (ext_key == true)
            {
                ext_key = false;
                KBCWait4IBE();
                SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
                KBCWait4IBE();
                SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);
            }
        }

        public static void KeyDownEx(Vk_Key vk_code) // 该发什么?
        {
            if (vk_code == Vk_Key.None)
                return;
            int btScancode = 0;
            btScancode = MapVirtualKey((byte)vk_code, 0);
            ext_key = true;

            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)0xE0, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);
        }
        
        public static void KeyUp(Vk_Key vk_code) // 该发什么?
        {
            if (vk_code == Vk_Key.None)
                return;

            int btScancode = 0;
            btScancode = MapVirtualKey((byte)vk_code, 0);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1);
            if (ext_key == true)
            {
                KBCWait4IBE();
                SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
                KBCWait4IBE();
                SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1);
                ext_key = false;
            }
        }

        public static void KeyUpEx(Vk_Key vk_code) // 该发什么?
        {
            if (vk_code == Vk_Key.None)
                return;

            int btScancode = 0;
            btScancode = MapVirtualKey((byte)vk_code, 0);
            ext_key = true;
            
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)0xE0, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1);
        }

        public static void KeyDown_All(Vk_Key vk_code)
        {
            int i = (int)vk_code;
            if ((i > 48 && i <= 111) || (i == 32))
            {
                KeyDown(vk_code);
            }
            else
                KeyDownEx(vk_code);
        }

        public static void KeyUp_All(Vk_Key vk_code)
        {
            int i = (int)vk_code;
            if ((i > 48 && i <= 111) || (i == 32))
            {
                KeyUp(vk_code);
            }
            else
                KeyUpEx(vk_code);
        }

        public enum Vk_Key
        {
            // mouse movements
            None = 0,
            move = 0x0001,
            leftdown = 0x0002,
            leftup = 0x0004,
            rightdown = 0x0008,
            rightup = 0x0010,
            middledown = 0x0020,
            //keyboard stuff
            VK_LBUTTON = 1,
            VK_RBUTTON = 2,
            VK_CANCEL = 3,
            VK_MBUTTON = 4,

            Back = 8,
            Tab = 9,
            Clear = 12,
            Return = 13,
            Enter = 13,
            LeftShift = 16,
            RightShift = 16,
            LeftCtrl = 17,
            RightCtrl = 17,
            LeftAlt = 18,
            RightAlt = 18,
            Pause = 19,
            Capital = 20,
            CapsLock = 20,
            Escape = 27,
            Space = 32,
            Prior = 33,
            PageUp = 33,
            Next = 34,
            PageDown = 34,
            End = 35,
            Home = 36,
            Left = 37,
            Up = 38,
            Right = 39,
            Down = 40,
            Select = 41,
            Print = 42,
            Execute = 43,
            Snapshot = 44,
            PrintScreen = 44,
            Insert = 45,
            Delete = 46,
            Help = 47,
            D0 = 48, //0
            D1 = 49, //1
            D2 = 50, //2
            D3 = 51, //3
            D4 = 52, //4
            D5 = 53, //5
            D6 = 54, //6
            D7 = 55, //7
            D8 = 56, //8
            D9 = 57, //9
            A = 65, //A
            B = 66, //B
            C = 67, //C
            D = 68, //D
            E = 69, //E
            F = 70, //F
            G = 71, //G
            H = 72, //H
            I = 73, //I
            J = 74, //J
            K = 75, //K
            L = 76, //L
            M = 77, //M
            N = 78, //N
            O = 79, //O
            P = 80, //P
            Q = 81, //Q
            R = 82, //R
            S = 83, //S
            T = 84, //T
            U = 85, //U
            V = 86, //V
            W = 87, //W
            X = 88, //X
            Y = 89, //Y
            Z = 90, //Z
            Numpad0 = 96, //0
            Numpad1 = 97, //1
            Numpad2 = 98, //2
            NumpadD3 = 99, //3
            Numpad4 = 100, //4
            Numpad5 = 101, //5
            Numpad6 = 102, //6
            Numpad7 = 103, //7
            Numpad8 = 104, //8
            Numpad9 = 105, //9
            Multiply = 106,
            Add = 107,
            Separator = 108,
            Subtract = 109,
            Decimal = 110,
            Divide = 111,
            F1 = 112,
            F2 = 113,
            F3 = 114,
            F4 = 115,
            F5 = 116,
            F6 = 117,
            F7 = 118,
            F8 = 119,
            F9 = 120,
            F10 = 121,
            F11 = 122,
            F12 = 123,
            NumLock = 144,
            Scroll = 145,
            ExtendedKey = 0x00E0,
            middleup = 0x0040,
            xdown = 0x0080,
            xup = 0x0100,
            wheel = 0x0800,
            virtualdesk = 0x4000,
            absolute = 0x8000
        }
--------------------编程问答-------------------- 又看到了这样的表格,彻底混乱了。。这表格的定义和这枚举相差甚远啊。。

但这个枚举做按键似乎是对的,那这表格是干什么的?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,