关于WinIO.DLL的键盘输入模拟
2009-10-19 12:50 Animax! 阅读(6210) 评论(14) 收藏 举报  最近在找键盘模拟的方式,最后在网上找到了一个WinIO.DLL的IO键盘模拟按键的方式。但是居然那个方法是有问题的。我造了全局的hook监视键盘信息,发现它只是有keyDown和keyPress的消息,keyUp的信息是up了一个zoom的键。
  搞了2天终于找到了正确的方式,以下是代码(使用需要winIo.dll,winIo.vxd,winIo.sys):
 public class WinIOLab
    public class WinIOLab {
    { private const int KBC_KEY_CMD = 0x64;
        private const int KBC_KEY_CMD = 0x64; private const int KBC_KEY_DATA = 0x60;
        private const int KBC_KEY_DATA = 0x60; [DllImport("winio.dll")]
        [DllImport("winio.dll")] private static extern bool InitializeWinIo();
        private static extern bool InitializeWinIo(); [DllImport("winio.dll")]
        [DllImport("winio.dll")] private static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize);
        private static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize); [DllImport("winio.dll")]
        [DllImport("winio.dll")] private static extern bool SetPortVal(uint wPortAddr, IntPtr dwPortVal, byte bSize);
        private static extern bool SetPortVal(uint wPortAddr, IntPtr dwPortVal, byte bSize); [DllImport("winio.dll")]
        [DllImport("winio.dll")] private static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle);
        private static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle); [DllImport("winio.dll")]
        [DllImport("winio.dll")] private static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr);
        private static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr); [DllImport("winio.dll")]
        [DllImport("winio.dll")] private static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal);
        private static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal); [DllImport("winio.dll")]
        [DllImport("winio.dll")] private static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal);
        private static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal); [DllImport("winio.dll")]
        [DllImport("winio.dll")] private static extern void ShutdownWinIo();
        private static extern void ShutdownWinIo(); [DllImport("user32.dll")]
        [DllImport("user32.dll")] private static extern int MapVirtualKey(uint Ucode, uint uMapType);
        private static extern int MapVirtualKey(uint Ucode, uint uMapType);

 private WinIOLab()
        private WinIOLab() {
        { IsInitialize = true;
            IsInitialize = true; }
        } public static void Initialize()
        public static void Initialize() {
        { if (InitializeWinIo())
            if (InitializeWinIo()) {
            { KBCWait4IBE();
                KBCWait4IBE(); IsInitialize = true;
                IsInitialize = true; }
            } }
        } public static void Shutdown()
        public static void Shutdown() {
        { if (IsInitialize)
            if (IsInitialize) ShutdownWinIo();
                ShutdownWinIo(); IsInitialize = false;
            IsInitialize = false; }
        }
 private static bool IsInitialize { get; set; }
        private static bool IsInitialize { get; set; }
 ///等待键盘缓冲区为空
        ///等待键盘缓冲区为空 private static void KBCWait4IBE()
        private static void KBCWait4IBE() {
        { int dwVal = 0;
            int dwVal = 0; do
            do {
            { bool flag = GetPortVal((IntPtr)0x64, out dwVal, 1);
                bool flag = GetPortVal((IntPtr)0x64, out dwVal, 1); }
            } while ((dwVal & 0x2) > 0);
            while ((dwVal & 0x2) > 0); }
        } /// 模拟键盘标按下
        /// 模拟键盘标按下 public static void KeyDown(Keys vKeyCoad)
        public static void KeyDown(Keys vKeyCoad) {
        { if (!IsInitialize) return;
            if (!IsInitialize) return;
 int btScancode = 0;
            int btScancode = 0; btScancode = MapVirtualKey((uint)vKeyCoad, 0);
            btScancode = MapVirtualKey((uint)vKeyCoad, 0); KBCWait4IBE();
            KBCWait4IBE(); SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1); KBCWait4IBE();
            KBCWait4IBE(); SetPortVal(KBC_KEY_DATA, (IntPtr)0x60, 1);
            SetPortVal(KBC_KEY_DATA, (IntPtr)0x60, 1); KBCWait4IBE();
            KBCWait4IBE();  SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1); KBCWait4IBE();
            KBCWait4IBE(); SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);
            SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1); }
        } /// 模拟键盘弹出
        /// 模拟键盘弹出 public static void KeyUp(Keys vKeyCoad)
        public static void KeyUp(Keys vKeyCoad) {
        { if (!IsInitialize) return;
            if (!IsInitialize) return;
 int btScancode = 0;
            int btScancode = 0; btScancode = MapVirtualKey((uint)vKeyCoad, 0);
            btScancode = MapVirtualKey((uint)vKeyCoad, 0); KBCWait4IBE();
            KBCWait4IBE();  SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);  KBCWait4IBE();
            KBCWait4IBE(); SetPortVal(KBC_KEY_DATA, (IntPtr)0x60, 1);
            SetPortVal(KBC_KEY_DATA, (IntPtr)0x60, 1); KBCWait4IBE();
            KBCWait4IBE();  SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);  KBCWait4IBE();
            KBCWait4IBE(); SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1);
            SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1); }
        } }
    }
    keyDown和keyUp的信息都是用0x60,而keyUp则是在Key加上了 or 0x80 而已。
  但是使用winIO.dll的办法在Win7 64x 上用不了的,根本注册不了驱动,不知有没有人研究得出解决办法。有的话请联系我:Anima.My@Gmail.com,谢谢。
 
                     
                    
                 
                    
                 
    
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号