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}\r\n", 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
          }
          }
          }

           

          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/hi123456/archive/2009/11/10/4791043.aspx

          posted on 2010-10-26 15:46 sanmao 閱讀(809) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 武清区| 兴化市| 榆中县| 丰都县| 镇康县| 光山县| 房产| 修文县| 林州市| 洛扎县| 博爱县| 德令哈市| 海阳市| 罗定市| 临湘市| 公安县| 蓬安县| 饶平县| 西畴县| 三穗县| 茶陵县| 即墨市| 慈溪市| 长子县| 大荔县| 富顺县| 宁德市| 射阳县| 秦皇岛市| 乌拉特中旗| 洞口县| 河间市| 冕宁县| 东乌珠穆沁旗| 平遥县| 石城县| 永胜县| 镶黄旗| 方正县| 绿春县| 浪卡子县|