C#中使用WinIO模拟键盘鼠标(转)

简介: 原文地址在哪忘了,对不起额。  public class WinIOLab    {        private const int KBC_KEY_CMD = 0x64;        private const int KBC_KEY_DATA = 0x60;        [DllImport("winio32.

原文地址在哪忘了,对不起额。


   public  class WinIOLab
    {
         private  const  int KBC_KEY_CMD =  0x64;
         private  const  int KBC_KEY_DATA =  0x60;
        [DllImport( " winio32.dll ")]
         private  static  extern  bool InitializeWinIo();
        [DllImport( " winio32.dll ")]
         private  static  extern  bool GetPortVal(IntPtr wPortAddr,  out  int pdwPortVal,  byte bSize);
        [DllImport( " winio32.dll ")]
         private  static  extern  bool SetPortVal( uint wPortAddr, IntPtr dwPortVal,  byte bSize);
        [DllImport( " winio32.dll ")]
         private  static  extern  byte MapPhysToLin( byte pbPhysAddr,  uint dwPhysSize, IntPtr PhysicalMemoryHandle);
        [DllImport( " winio32.dll ")]
         private  static  extern  bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle,  byte pbLinAddr);
        [DllImport( " winio32.dll ")]
         private  static  extern  bool GetPhysLong(IntPtr pbPhysAddr,  byte pdwPhysVal);
        [DllImport( " winio32.dll ")]
         private  static  extern  bool SetPhysLong(IntPtr pbPhysAddr,  byte dwPhysVal);
        [DllImport( " winio32.dll ")]
         private  static  extern  void ShutdownWinIo();
        [DllImport( " user32.dll ")]
         private  static  extern  int MapVirtualKey( uint Ucode,  uint uMapType);


         private WinIOLab()
        {
            IsInitialize =  true;
        }
         public  static  void Initialize()
        {
             if (InitializeWinIo())
            {
                KBCWait4IBE();
                IsInitialize =  true;
            }
        }
         public  static  void Shutdown()
        {
             if (IsInitialize)
                ShutdownWinIo();
            IsInitialize =  false;
        }

         private  static  bool IsInitialize {  getset; }

         /// 等待键盘缓冲区为空
         private  static  void KBCWait4IBE()
        {
             int dwVal =  0;
             do
            {
                 bool flag = GetPortVal((IntPtr) 0x64out dwVal,  1);
            }
             while ((dwVal &  0x2) >  0);
        }
         ///  模拟键盘标按下
         public  static  void KeyDown(Keys vKeyCoad)
        {
             if (!IsInitialize)  return;

             int btScancode =  0;
            btScancode = MapVirtualKey(( uint)vKeyCoad,  0);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr) 0xD21);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr) 0x601);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr) 0xD21);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode,  1);
        }
         ///  模拟键盘弹出
         public  static  void KeyUp(Keys vKeyCoad)
        {
             if (!IsInitialize)  return;

             int btScancode =  0;
            btScancode = MapVirtualKey(( uint)vKeyCoad,  0);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr) 0xD21);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr) 0x601);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr) 0xD21);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode |  0x80),  1);
        }
    }

 

调用


 WinIOLab.Initialize();  //  注册
 WinIOLab.KeyDown(Keys.A);  //  按下A
 WinIOLab.KeyUp(Keys.A);  //  松开A
 WinIOLab.Shutdown();  //  用完后注销


 

 

目录
相关文章
鼠标按下或鼠标松开做不同的处理
鼠标按下或鼠标松开做不同的处理
vbs鼠标方法——模拟鼠标按键
'*********************************************************************** ' 代码开始 '*********************************************************************** Set mouse=New SetMouse mouse.
4481 0
|
4月前
低仿lusaxweb鼠标
低仿lusaxweb鼠标
21 0
重新认识键盘与鼠标——键盘事件与鼠标事件
重新认识键盘与鼠标——键盘事件与鼠标事件
250 0
重新认识键盘与鼠标——键盘事件与鼠标事件
|
API
用VBS控制鼠标的实现代码(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击)
网上搜到的答案普遍是VBS无法实现,或者是要用第三方COM(ActiveX?)组件。我对第三方组件是很反感的,使用第三方组件毫无可移植性可言,因为别人的系统中不一定注册了这个组件。我的建议是,尽量不要在VBS代码中调用第三方组件,除非你的程序只是写来自己用。
2188 0