C#类模拟键盘和鼠标以及内存读取

来源:互联网 发布:误删表格数据怎么恢复 编辑:程序博客网 时间:2024/06/11 22:10

 key kk = new key();
            //  IntPtr a = new IntPtr();
            kk.sendwinio();
            kk.MykeyDown((int)key.VirtualKeys.VK_F1);
            System.Threading.Thread.Sleep(2000);
            kk.MykeyUp((int)key.VirtualKeys.VK_F1);
这是模拟键盘的调用方式

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Management;
namespace sendkey
{
    public class key
    {
        const uint PROCESS_ALL_ACCESS = 0x001F0FFF;
        const uint KEYEVENTF_EXTENDEDKEY = 0x1;
        const uint KEYEVENTF_KEYUP = 0x2;
        private readonly int MOUSEEVENTF_LEFTDOWN = 0x2;
        private readonly int MOUSEEVENTF_LEFTUP = 0x4;
        const uint KBC_KEY_CMD = 0x64;
        const uint KBC_KEY_DATA = 0x60;
        //得到窗体句柄的函数,FindWindow函数用来返回符合指定的类名( ClassName )和窗口名( WindowTitle )的窗口句柄
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindow(
        string lpClassName, //   pointer   to   class   name  
        string lpWindowName   //   pointer   to   window   name  
        );
        [DllImport("user32.dll")]
        private static extern int GetWindowThreadProcessId(IntPtr id,int pid);
      
        [DllImport("kernel32.dll")]
        private static extern void CloseHandle
        (
         uint hObject //Handle to object
        );
        //读取进程内存的函数
        [DllImport("kernel32.dll")]
        static extern bool ReadProcessMemory(uint hProcess, IntPtr lpBaseAddress,
           IntPtr lpBuffer, uint nSize, ref   uint lpNumberOfBytesRead);
        //得到目标进程句柄的函数
        [DllImport("kernel32.dll")]
        public static extern uint OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId);
        //鼠标事件声明
        [DllImport("user32.dll")]
        static extern bool setcursorpos(int x, int y);
        [DllImport("user32.dll")]
        static extern void mouse_event(mouseeventflag flags, int dx, int dy, uint data, UIntPtr extrainfo);
        //键盘事件声明
        [DllImport("user32.dll")]
        static extern byte MapVirtualKey(byte wCode, int wMap);
        [DllImport("user32.dll")]
        static extern short GetKeyState(int nVirtKey);
        [DllImport("user32.dll")]
        static extern void keybd_event( byte bVk, byte bScan,uint dwFlags,uint dwExtraInfo);
        //键盘事件声明winio
        [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();  /**//// <summary>

        /// 获取进程pid
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        private int pid(String  name)
        {
            try
            {
                ObjectQuery oQuery = new ObjectQuery("select * from Win32_Process where Name='" + name + "'");
                ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oQuery);
                ManagementObjectCollection oReturnCollection = oSearcher.Get();

                string pid = "";
                string cmdLine;
                StringBuilder sb = new StringBuilder();
                foreach (ManagementObject oReturn in oReturnCollection)
                {
                    pid = oReturn.GetPropertyvalue("ProcessId").ToString();
                    //cmdLine = (string)oReturn.GetPropertyvalue("CommandLine");

                    //string pattern = "-ap "(.*)"";
                    //Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
                    // Match match = regex.Match(cmdLine);
                    //string appPoolName = match.Groups[1].ToString();
                    //sb.AppendFormat("W3WP.exe PID: {0}   AppPoolId:{1} ", pid, appPoolName);
                }
                return Convert.ToInt32(pid);
            }
            catch (Exception ss)
            { return 0; }

        }
        private int pid(IntPtr id)
        {
             int pid=0;
             pid=GetWindowThreadProcessId(id, pid);
             return 260;
        }
        /**//// <summary>
        /// 读取内存值
        /// </summary>
        /// <param name="name">进程id</param>
        /// <param name="dizhi">读取的内存地址</param>
        /// <returns></returns>
        //public String getread(String QEC,String EC, IntPtr dizhi, uint size)
        //{
        //    Byte bt = new Byte();
        //    IntPtr id=FindWindow(QEC, EC);
        //    uint hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid(id));
        //    IntPtr fanhui = new IntPtr();
        //    String gg = null;
        //    if (hProcess == 0)
        //    {
        //       // gg = ReadProcessMemory(hProcess, dizhi, fanhui, size, 0);
        //       // CloseHandle(hProcess);
              

        //    }
        //    return gg;
        //}
        public String getread(String jincheng, String EC, IntPtr dizhi, uint size)
        {
            byte[] VBuffer = new byte[4];
            IntPtr VBytesAddress = Marshal.UnsafeAddrOfPinnedArrayElement(VBuffer, 0); // 得到缓冲区的地址
         
            uint vNumberOfBytesRead = 0;
            Byte bt = new Byte();
            //IntPtr id = FindWindow(QEC, EC);
            uint hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid(jincheng));
            //pid(0);
            IntPtr fanhui = new IntPtr();
            String gg = null;
            //if (hProcess == 0)
            //{
                if (ReadProcessMemory(hProcess, dizhi, VBytesAddress, (uint)VBuffer.Length, ref hProcess))
                {
                    CloseHandle(hProcess);
                }
                else
                {
                    CloseHandle(hProcess);
                }

           // }
            int vInt = Marshal.ReadInt32(VBytesAddress);
            return vInt.ToString() ;
        }
        /**//// <summary>
        /// 获取键盘状态
        /// </summary>
        /// <param name="Key"></param>
        /// <returns></returns>
        public  bool GetState(VirtualKeys Key)
        {
            return (GetKeyState((int)Key) == 1);
        }
        /**//// <summary>
        /// 发送键盘事件
        /// </summary>
        /// <returns></returns>
        public void Send(VirtualKeys Key, bool State)
        {
            if (State != GetState(Key))
            {
               byte a= MapVirtualKey((byte)Key, 0);
                keybd_event((byte)Key, MapVirtualKey((byte)Key, 0), 0, 0);
                System.Threading.Thread.Sleep(1000);
                keybd_event((byte)Key, MapVirtualKey((byte)Key, 0), KEYEVENTF_KEYUP, 0);
            }
        }
        /**//// <summary>
        /// 初始化winio
        /// </summary>
        public void sendwinio()
        {
            if (InitializeWinIo())
            {
                KBCWait4IBE();
            }
        }
        private void KBCWait4IBE() //等待键盘缓冲区为空
        {
            //int[] dwVal = new int[] { 0 };
            int dwVal = 0;
            do
            {
                //这句表示从&H64端口读取一个字节并把读出的数据放到变量dwVal中
                //GetPortVal函数的用法是GetPortVal 端口号,存放读出数据的变量,读入的长度
                bool flag = GetPortVal((IntPtr)0x64, out dwVal, 1);
            }
            while ((dwVal & 0x2) > 0);
        }
        /**//// <summary>
        /// 模拟键盘标按下
        /// </summary>
        /// <param name="vKeyCoad"></param>
        public void MykeyDown(int vKeyCoad)
        {
            int btScancode = 0;

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

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

        }
        /**//// <summary>
        /// 模拟键盘弹出
        /// </summary>
        /// <param name="vKeyCoad"></param>
        public void MykeyUp(int vKeyCoad)
        {
            int btScancode = 0;
            btScancode = MapVirtualKey((byte)vKeyCoad, 0);
            //btScancode = vKeyCoad;

            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);// '写入按键信息,释放键
        }
        /**//// <summary>
        /// 模拟鼠标按下
        /// </summary>
        /// <param name="vKeyCoad"></param>
        public void MyMouseDown(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|0x80), 1);// '写入按键信息,按下键

        }
        /**//// <summary>
        /// 模拟鼠标弹出
        /// </summary>
        /// <param name="vKeyCoad"></param>
        public void MyMouseUp(int vKeyCoad)
        {
            int btScancode = 0;
            btScancode = MapVirtualKey((byte)vKeyCoad, 0);
           // btScancode = vKeyCoad;

            KBCWait4IBE(); // '发送数据前应该先等待键盘缓冲区为空
            SetPortVal(KBC_KEY_CMD,(IntPtr) 0xD3, 1); //'发送键盘写入命令
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1);// '写入按键信息,释放键
        }
        /**//// <summary>
        /// 发送鼠标事件
        /// </summary>
        /// <returns></returns>
        public void SendMouse()
        {
          
        }
        /**//// <summary>
        /// 鼠标动作枚举
        /// </summary>
        public  enum mouseeventflag : uint
        {
            move = 0x0001,
            leftdown = 0x0002,
            leftup = 0x0004,
            rightdown = 0x0008,
            rightup = 0x0010,
            middledown = 0x0020,
            middleup = 0x0040,
            xdown = 0x0080,
            xup = 0x0100,
            wheel = 0x0800,
            virtualdesk = 0x4000,
            absolute = 0x8000
        }
        /**//// <summary>
        /// 键盘动作枚举
        /// </summary>
        public enum VirtualKeys : byte
        {
            //VK_NUMLOCK = 0x90, //数字锁定键
            //VK_SCROLL = 0x91,  //滚动锁定
            //VK_CAPITAL = 0x14, //大小写锁定
            //VK_A = 62,         //键盘A
            VK_LBUTTON=1,      //鼠标左键
          VK_RBUTTON=2,     //鼠标右键
         VK_CANCEL=3,    //Ctrl+Break(通常不需要处理)
     VK_MBUTTON=4,    //鼠标中键
      VK_BACK=8,      //Backspace
      VK_TAB=9,      //Tab
      VK_CLEAR=12,    //Num Lock关闭时的数字键盘5
      VK_RETURN=13,   //Enter(或者另一个)
       VK_SHIFT=16,    //Shift(或者另一个)
      VK_CONTROL=17,   //Ctrl(或者另一个)
      VK_MENU=18,    //Alt(或者另一个)
      VK_PAUSE=19,    //Pause
      VK_CAPITAL=20,   //Caps Lock
      VK_ESCAPE=27,   //Esc
      VK_SPACE=32,    //Spacebar
      VK_PRIOR=33,    //Page Up
      VK_NEXT=34,    //Page Down
      VK_END=35,     //End
      VK_HOME=36,    //Home
      VK_LEFT=37,     //左箭头
       VK_UP=38,      //上箭头
      VK_RIGHT=39,    //右箭头
      VK_DOWN=40,     //下箭头
      VK_SELECT=41,    //可选
      VK_PRINT=42,    //可选
      VK_EXECUTE=43,   //可选
      VK_SNAPSHOT=44,  //Print Screen
      VK_INSERT=45,   //Insert
      VK_DELETE=46,    //Delete
      VK_HELP=47,      //可选
            VK_NUM0=48,        //0
            VK_NUM1=49,        //1
            VK_NUM2=50,        //2
            VK_NUM3=51,        //3
            VK_NUM4=52,        //4
            VK_NUM5=53,        //5
            VK_NUM6=54,        //6
            VK_NUM7=55,        //7
            VK_NUM8=56,        //8
            VK_NUM9=57,        //9
            VK_A=65,           //A
            VK_B=66,           //B
            VK_C=67,           //C
            VK_D=68,           //D
            VK_E=69,           //E
            VK_F=70,           //F
            VK_G=71,           //G
            VK_H=72,           //H
            VK_I=73,           //I
            VK_J=74,           //J
            VK_K=75,           //K
            VK_L=76,           //L
            VK_M=77,           //M
            VK_N=78,           //N
            VK_O=79,           //O
            VK_P=80,           //P
            VK_Q=81,           //Q
            VK_R=82,           //R
            VK_S=83,           //S
            VK_T=84,           //T
            VK_U=85,           //U
            VK_V=86,           //V
            VK_W=87,           //W
            VK_X=88,           //X
            VK_Y=89,           //Y
            VK_Z=90,           //Z
            VK_NUMPAD0=96,     //0
            VK_NUMPAD1=97,     //1
            VK_NUMPAD2=98,     //2
            VK_NUMPAD3=99,     //3
            VK_NUMPAD4=100,    //4
            VK_NUMPAD5=101,    //5
            VK_NUMPAD6=102,    //6
            VK_NUMPAD7=103,    //7
            VK_NUMPAD8=104,    //8
            VK_NUMPAD9=105,    //9
        VK_NULTIPLY=106,  //数字键盘上的*
      VK_ADD=107,    //数字键盘上的+
        VK_SEPARATOR=108, //可选
        VK_SUBTRACT=109,  //数字键盘上的-
        VK_DECIMAL=110,  //数字键盘上的.
        VK_DIVIDE=111,   //数字键盘上的/
            VK_F1=112,
            VK_F2=113,
            VK_F3=114,
            VK_F4=115,
            VK_F5=116,
            VK_F6=117,
            VK_F7=118,
            VK_F8=119,
            VK_F9=120,
            VK_F10=121,
            VK_F11=122,
            VK_F12=123,
            VK_NUMLOCK=144,  //Num Lock
        VK_SCROLL=145     // Scroll Lock
        }
    }
}
本篇文章来源于:开发学院 http://edu.codepub.com   原文链接:http://edu.codepub.com/2011/0203/29154.php

原创粉丝点击