目前流行的做法是使用winio模擬鍵盤硬件掃描碼,但是winio并不穩定,時常有嚴重錯誤發生。使用keybd_event函數,這種方法非常簡單,而且極為穩定。
一、keybd_event使用
詳見:
https://www.cnblogs.com/xielong/p/6763121.html
//鍵盤事件
? ? ? ? #region bVk參數 常量定義
? ? ? ? public const byte vbKeyLButton = 0x1;? ? // 鼠標左鍵
? ? ? ? public const byte vbKeyRButton = 0x2;? ? // 鼠標右鍵
? ? ? ? public const byte vbKeyCancel = 0x3;? ? // CANCEL 鍵
? ? ? ? public const byte vbKeyMButton = 0x4;? ? // 鼠標中鍵
? ? ? ? public const byte vbKeyBack = 0x8;? ? ? // BACKSPACE 鍵
? ? ? ? public const byte vbKeyTab = 0x9;? ? ? ? // TAB 鍵
? ? ? ? public const byte vbKeyClear = 0xC;? ? ? // CLEAR 鍵
? ? ? ? public const byte vbKeyReturn = 0xD;? ? // ENTER 鍵
? ? ? ? public const byte vbKeyShift = 0x10;? ? // SHIFT 鍵
? ? ? ? public const byte vbKeyControl = 0x11;? // CTRL 鍵
? ? ? ? public const byte vbKeyAlt = 18;? ? ? ? // Alt 鍵? (鍵碼18)
? ? ? ? public const byte vbKeyMenu = 0x12;? ? ? // MENU 鍵
? ? ? ? public const byte vbKeyPause = 0x13;? ? // PAUSE 鍵
? ? ? ? public const byte vbKeyCapital = 0x14;? // CAPS LOCK 鍵
? ? ? ? public const byte vbKeyEscape = 0x1B;? ? // ESC 鍵
? ? ? ? public const byte vbKeySpace = 0x20;? ? // SPACEBAR 鍵
? ? ? ? public const byte vbKeyPageUp = 0x21;? ? // PAGE UP 鍵
? ? ? ? public const byte vbKeyEnd = 0x23;? ? ? // End 鍵
? ? ? ? public const byte vbKeyHome = 0x24;? ? ? // HOME 鍵
? ? ? ? public const byte vbKeyLeft = 0x25;? ? ? // LEFT ARROW 鍵
? ? ? ? public const byte vbKeyUp = 0x26;? ? ? ? // UP ARROW 鍵
? ? ? ? public const byte vbKeyRight = 0x27;? ? // RIGHT ARROW 鍵
? ? ? ? public const byte vbKeyDown = 0x28;? ? ? // DOWN ARROW 鍵
? ? ? ? public const byte vbKeySelect = 0x29;? ? // Select 鍵
? ? ? ? public const byte vbKeyPrint = 0x2A;? ? // PRINT SCREEN 鍵
? ? ? ? public const byte vbKeyExecute = 0x2B;? // EXECUTE 鍵
? ? ? ? public const byte vbKeySnapshot = 0x2C;? // SNAPSHOT 鍵
? ? ? ? public const byte vbKeyDelete = 0x2E;? ? // Delete 鍵
? ? ? ? public const byte vbKeyHelp = 0x2F;? ? ? // HELP 鍵
? ? ? ? public const byte vbKeyNumlock = 0x90;? // NUM LOCK 鍵
? ? ? ? //常用鍵 字母鍵A到Z
? ? ? ? public const byte vbKeyA = 65;
? ? ? ? public const byte vbKeyB = 66;
? ? ? ? public const byte vbKeyC = 67;
? ? ? ? public const byte vbKeyD = 68;
? ? ? ? public const byte vbKeyE = 69;
? ? ? ? public const byte vbKeyF = 70;
? ? ? ? public const byte vbKeyG = 71;
? ? ? ? public const byte vbKeyH = 72;
? ? ? ? public const byte vbKeyI = 73;
? ? ? ? public const byte vbKeyJ = 74;
? ? ? ? public const byte vbKeyK = 75;
? ? ? ? public const byte vbKeyL = 76;
? ? ? ? public const byte vbKeyM = 77;
? ? ? ? public const byte vbKeyN = 78;
? ? ? ? public const byte vbKeyO = 79;
? ? ? ? public const byte vbKeyP = 80;
? ? ? ? public const byte vbKeyQ = 81;
? ? ? ? public const byte vbKeyR = 82;
? ? ? ? public const byte vbKeyS = 83;
? ? ? ? public const byte vbKeyT = 84;
? ? ? ? public const byte vbKeyU = 85;
? ? ? ? public const byte vbKeyV = 86;
? ? ? ? public const byte vbKeyW = 87;
? ? ? ? public const byte vbKeyX = 88;
? ? ? ? public const byte vbKeyY = 89;
? ? ? ? public const byte vbKeyZ = 90;
? ? ? ? //數字鍵盤0到9
? ? ? ? public const byte vbKey0 = 48;? ? // 0 鍵
? ? ? ? public const byte vbKey1 = 49;? ? // 1 鍵
? ? ? ? public const byte vbKey2 = 50;? ? // 2 鍵
? ? ? ? public const byte vbKey3 = 51;? ? // 3 鍵
? ? ? ? public const byte vbKey4 = 52;? ? // 4 鍵
? ? ? ? public const byte vbKey5 = 53;? ? // 5 鍵
? ? ? ? public const byte vbKey6 = 54;? ? // 6 鍵
? ? ? ? public const byte vbKey7 = 55;? ? // 7 鍵
? ? ? ? public const byte vbKey8 = 56;? ? // 8 鍵
? ? ? ? public const byte vbKey9 = 57;? ? // 9 鍵
? ? ? ? public const byte vbKeyNumpad0 = 0x60;? ? //0 鍵
? ? ? ? public const byte vbKeyNumpad1 = 0x61;? ? //1 鍵
? ? ? ? public const byte vbKeyNumpad2 = 0x62;? ? //2 鍵
? ? ? ? public const byte vbKeyNumpad3 = 0x63;? ? //3 鍵
? ? ? ? public const byte vbKeyNumpad4 = 0x64;? ? //4 鍵
? ? ? ? public const byte vbKeyNumpad5 = 0x65;? ? //5 鍵
? ? ? ? public const byte vbKeyNumpad6 = 0x66;? ? //6 鍵
? ? ? ? public const byte vbKeyNumpad7 = 0x67;? ? //7 鍵
? ? ? ? public const byte vbKeyNumpad8 = 0x68;? ? //8 鍵
? ? ? ? public const byte vbKeyNumpad9 = 0x69;? ? //9 鍵
? ? ? ? public const byte vbKeyMultiply = 0x6A;? // MULTIPLICATIONSIGN(*)鍵
? ? ? ? public const byte vbKeyAdd = 0x6B;? ? ? ? // PLUS SIGN(+) 鍵
? ? ? ? public const byte vbKeySeparator = 0x6C;? // ENTER 鍵
? ? ? ? public const byte vbKeySubtract = 0x6D;? // MINUS SIGN(-) 鍵
? ? ? ? public const byte vbKeyDecimal = 0x6E;? ? // DECIMAL POINT(.) 鍵
? ? ? ? public const byte vbKeyDivide = 0x6F;? ? // DIVISION SIGN(/) 鍵
? ? ? ? //F1到F12按鍵
? ? ? ? public const byte vbKeyF1 = 0x70;? //F1 鍵
? ? ? ? public const byte vbKeyF2 = 0x71;? //F2 鍵
? ? ? ? public const byte vbKeyF3 = 0x72;? //F3 鍵
? ? ? ? public const byte vbKeyF4 = 0x73;? //F4 鍵
? ? ? ? public const byte vbKeyF5 = 0x74;? //F5 鍵
? ? ? ? public const byte vbKeyF6 = 0x75;? //F6 鍵
? ? ? ? public const byte vbKeyF7 = 0x76;? //F7 鍵
? ? ? ? public const byte vbKeyF8 = 0x77;? //F8 鍵
? ? ? ? public const byte vbKeyF9 = 0x78;? //F9 鍵
? ? ? ? public const byte vbKeyF10 = 0x79;? //F10 鍵
? ? ? ? public const byte vbKeyF11 = 0x7A;? //F11 鍵
? ? ? ? public const byte vbKeyF12 = 0x7B;? //F12 鍵
? ? ? ? #endregion
? ? ? ? #region 引用win32api方法
? ? ? ? /// <summary>
? ? ? ? /// 導入模擬鍵盤的方法
? ? ? ? /// </summary>
? ? ? ? /// <param name="bVk" >按鍵的虛擬鍵值</param>
? ? ? ? /// <param name= "bScan" >掃描碼,一般不用設置,用0代替就行</param>
? ? ? ? /// <param name= "dwFlags" >選項標志:0:表示按下,2:表示松開</param>
? ? ? ? /// <param name= "dwExtraInfo">一般設置為0</param>
? ? ? ? [DllImport("user32.dll")]
? ? ? ? public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
? ? ? ? #endregion
調用:
//模擬按下A鍵
? ? ? ? ? ? keybd_event(vbKeyA, 0, 0, 0);
? ? ? ? ? ? //模擬松開A鍵
? ? ? ? ? ? keybd_event(vbKeyA, 0, 2, 0);
二、mouse_event使用
詳見:
http://blog.sina.com.cn/s/blog_71d894bd01013goa.html
//鼠標事件
? ? ? ? private readonly int MOUSEEVENTF_LEFTDOWN = 0x0002;//模擬鼠標移動
? ? ? ? private readonly int MOUSEEVENTF_MOVE = 0x0001;//模擬鼠標左鍵按下
? ? ? ? private readonly int MOUSEEVENTF_LEFTUP = 0x0004;//模擬鼠標左鍵抬起
? ? ? ? private readonly int MOUSEEVENTF_ABSOLUTE = 0x8000;//鼠標絕對位置
? ? ? ? private readonly int MOUSEEVENTF_RIGHTDOWN = 0x0008; //模擬鼠標右鍵按下
? ? ? ? private readonly int MOUSEEVENTF_RIGHTUP = 0x0010; //模擬鼠標右鍵抬起
? ? ? ? private readonly int MOUSEEVENTF_MIDDLEDOWN = 0x0020; //模擬鼠標中鍵按下
? ? ? ? private readonly int MOUSEEVENTF_MIDDLEUP = 0x0040;// 模擬鼠標中鍵抬起
? ? ? ? [DllImport("user32")]
? ? ? ? public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
? ? ? ? //自定義鼠標移動事件
? ? ? ? private void mouse_yd(int x, int y)
? ? ? ? {
? ? ? ? ? ? mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x * 65535 / 1600, y * 65535 / 900, 0, 0);//移動到需要點擊的位置
? ? ? ? }
? ? ? ? //自定義鼠標左鍵單擊
? ? ? ? private void mouse_dj()
? ? ? ? {
? ? ? ? ? ? int x = Cursor.Position.X;
? ? ? ? ? ? int y = Cursor.Position.Y;
? ? ? ? ? ? mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE, x * 65535 / 1600, y * 65535 / 900, 0, 0);//點擊
? ? ? ? ? ? mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE, x * 65535 / 1600, y * 65535 / 900, 0, 0);//抬起
? ? ? ? }