参数
hProcess为远程进程的句柄
pvAddressRemote用于指明远程进程中的地址
pvBufferLocal是本地进程中的内存地址
dwSize是需要传送的字节数
pdwNumBytesRead和pdwNumBytesWritten用于指明实际传送的字节数.当函数返回时,可以查看这两个参数的值.
ReadProcessMemory读出数据,权限要大一些。下面这个打开进程的方式具备了查询 读和写的权限
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, ProcessId)
然后就要结合上面的程序来搜索了。只有当内存是处于被占用状态时才去读取其中的内容,而忽略空闲状态的内存。程序我就不在这儿写了,和上面那段差不多。只是把dwTotalCommit = dwTotalCommit + mi.RegionSize换成了读取内存以及搜索这一块内存的函数而已。
1.通过FindWindow读取窗体的句柄
2.通过GetWindowThreadProcessId读取查找窗体句柄进程的PID值
3.用OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, ProcessId)打开查到PID值的进程. 此打开具备 读取,写入,查询的权限
4.ReadProcessMemory读出指定的内存地址数据
        }
        privateint pid(IntPtr id)
        {
            int pid =0;
            pid = GetWindowThreadProcessId(id, pid);
            return260;
        }
        ///<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 =newbyte[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>
        publicbool GetState(VirtualKeys Key)
        {
            return (GetKeyState((int)Key) ==1);
        }
        ///<summary>
        /// 发送键盘事件
        ///</summary>
        ///<returns></returns>
        publicvoid 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>
        publicvoid sendwinio()
        {
            if (InitializeWinIo())
            {
                KBCWait4IBE();
            }
        }
        privatevoid 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>
        publicvoid 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>
        publicvoid 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>
        publicvoid 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>
        publicvoid 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>
        publicvoid SendMouse()
        {
        }
        ///<summary>
        /// 鼠标动作枚举
        ///</summary>
        publicenum 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>
        publicenum 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 
        }
    }