原创 C#中winio.dll模拟鼠标问题(转帖)

2008-10-30 22:09 5548 3 3 分类: 软件与OS

http://topic.csdn.net/u/20080413/14/8b9d2234-53c3-497a-ba74-9f5df6347fc6.html


C#中winio.dll模拟鼠标问题。
我的操作系统是XP。
以下是我的代码:
public class WinIo 
    { 
        public const int KBC_KEY_CMD = 0x64; 
        public const int KBC_KEY_DATA = 0x60; 
        [DllImport("winio.dll")] 
        public static extern bool InitializeWinIo(); 
        [DllImport("winio.dll")] 
        public static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize); 
        [DllImport("winio.dll")] 
        public static extern bool SetPortVal(uint wPortAddr, IntPtr dwPortVal, byte bSize); 
        [DllImport("winio.dll")] 
        public static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle); 
        [DllImport("winio.dll")] 
        public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr); 
        [DllImport("winio.dll")] 
        public static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal); 
        [DllImport("winio.dll")] 
        public static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal); 
        [DllImport("winio.dll")] 
        public static extern void ShutdownWinIo(); 
        [DllImport("user32.dll")] 
        public static extern int MapVirtualKey(uint Ucode, uint uMapType); 
        public void sendwinio() 
        { 
            if (InitializeWinIo()) 
            { 
                KBCWait4IBE(); 
            } 
        } 

        public void closewinio() 
        {
            //关闭WinIO
            ShutdownWinIo(); 
            KBCWait4IBE(); 
        }

        ///等待键盘缓冲区为空 
        private void KBCWait4IBE() 
        { 
            int dwVal = 0; 
            do 
            { 
                bool flag = GetPortVal((IntPtr)0x64, out dwVal, 1); 
            } 
            while ((dwVal & 0x2) > 0); 
        } 
        /// 模拟键盘标按下 
        public void MykeyDown(int vKeyCoad) 
        { 
            int btScancode = 0; 
            btScancode = MapVirtualKey((byte)vKeyCoad, 0); 
            KBCWait4IBE(); // 等待键盘缓冲区为空 
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);// 发送命令 
            KBCWait4IBE(); 
            SetPortVal(KBC_KEY_DATA, (IntPtr)0xe2, 1);// 写入按键信息 
            KBCWait4IBE(); // '等待键盘缓冲区为空 
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);// '发送键盘写入命令 
            KBCWait4IBE(); 
            SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);// '写入按下键 
        } 
        /// 模拟键盘弹出 
        public void MykeyUp(int vKeyCoad) 
        { 
            int btScancode = 0; 
            btScancode = MapVirtualKey((byte)vKeyCoad, 0); 
            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);// '写入释放键 
        }

        //这个用来模拟按下键,参数vKeyCoad传入按键的虚拟码
        public void MyMouse(int vKeyCoad)
        {
            int btScancode = 0;

            btScancode = MapVirtualKey((byte)vKeyCoad, 0);
            btScancode = vKeyCoad;

            KBCWait4IBE(); // '发送数据前应该先等待键盘缓冲区为空
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD3, 1);// '发送键盘写入命令
            //SetPortVal函数用于向端口写入数据,它的用法是SetPortVal 端口号,欲写入的数据,写入数据的长度
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);// '写入按键信息,按下键

        }
}


//////////然后在程序中用到WINIO//////////////////
private void btnStart_Click(object sender, EventArgs e)
        {
            WinIo kk = new WinIo();
            //  IntPtr a = new IntPtr();
            kk.sendwinio();

            System.Threading.Thread.Sleep(5000);

            kk.MykeyDown(112);  //发送F1键按下
              System.Threading.Thread.Sleep(500);
            kk.MykeyUp(112);    //发送F1键弹起

              kk.MyMouse(0x09); //发送左键按下
              kk.MyMouse(0);
            kk.MyMouse(0x08); //发送左键释放
              kk.MyMouse(0);
            kk.MyMouse(0);
            kk.MyMouse(0);

            kk.closewinio();
}

按下btnStart按钮后,发现发送F1键正常的,但是发送左键没有反应。而且发送完发送左键以后会让我的系统再不能输入键盘了(就是打字什么的都不行了,没有反应了。)
我把发送左键代码注销掉,只是发送键盘消息,是正常的,而且发送完以后,我的机器还是可以正常的打字聊天。
PS:我已经把WinIo.dll,WinIo.sys,WINIO.VXD三个文件放我的程序目录下了。
请问为什么不能发鼠标消息,我错在哪里了?谁帮我解决了,我把分都给他。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条