keybd_event和mouse_event取代winio.dll

目前流行的做法是使用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);//抬起

? ? ? ? }

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容

  • 給自己的總是很多期待,期待更多的美好的回憶,我不要現在,不求飛黃騰達,只求讓自己心安理得的面對很多事情,秋天一轉眼...
    一個人的光陰閱讀 373評論 0 2
  • 1-------- 走進前端 2-------- jQuery 3-------- CSS 4-------- A...
    依依玖玥閱讀 2,353評論 0 34
  • 昨天深夜,女星景甜在微博上發文“想你的兔zhi”,并配上6張自拍照,沒想到體育界男神張繼科居然在下面點贊評論,“兔...
    五幻巧閱讀 579評論 0 0
  • 營銷而已! 營銷而已! 營銷而已! 古天樂前晚出席名表活動獲大會贈送名表,當他拿上手給傳媒拍照時竟一時失手,名表直...
    納雪風閱讀 425評論 0 0
  • 感恩邵總一天輕松喜悅自然無痕的生命智慧的分享,感恩自己有福報到達現場沐浴智慧。 由于帶孩子在場內待不住,我相信我錯...
    寸心潔白閱讀 120評論 1 1