C/C++使用keybd_event模擬鍵盤按鍵


 1 #include <stdio.h>
 2 #include <Windows.h>
 3 
 4 /*
 5     設置鍵盤大小寫狀態
 6     big:為TRUE則切換大寫狀態,否則切換小寫狀態
 7 */
 8 VOID MySetKeyBig(BOOL big = FALSE);
 9 
10 /*
11     模擬鍵盤按鍵,支持大小寫
12     str:需要按出的字符串
13 */
14 VOID MyAnalogKey(char *str);
15 
16 int main(void)
17 {
18     // 當程序運行1.5s時再執行模擬按鍵,以便選擇需要操作的窗口
19     Sleep(1500);
20     MyAnalogKey("Love life,Love BiaoGe.0123456789");
21     system("pause");
22     return 0;
23 }
24 
25 VOID MySetKeyBig(BOOL big)
26 {
27     // 判斷鍵盤CapsLock鍵是否開啟狀態,開啟狀態則為大寫,否則為小寫
28     if (GetKeyState(VK_CAPITAL))
29     {
30         // 如果當前鍵盤狀態為大寫,要求改小寫,則模擬按鍵CapsLock切換狀態
31         if (!big)
32         {
33             keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
34             keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
35         }
36     }
37     else
38     {
39         // 如果當前鍵盤狀態為小寫,要求改大寫,則模擬按鍵CapsLock切換狀態
40         if (big)
41         {
42             keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
43             keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
44         }
45     }
46 }
47 
48 VOID MyAnalogKey(char *str)
49 {
50     int iLen = 0;
51     char *tmp = NULL;
52     INPUT *keys = NULL;
53     BOOL bOldState = FALSE;
54 
55     // 保存此操作前的鍵盤狀態
56     bOldState = (BOOL)GetKeyState(VK_CAPITAL);
57     iLen = lstrlen(str);
58     tmp = (char *)malloc(iLen);
59     memmove(tmp, str, iLen);
60     for (int i = 0; i < iLen; i++)
61     {
62         // 某些符號非直屬鍵盤按鍵,這里只過濾轉換兩個,以后用到其它字符自行添加過濾
63         if (tmp[i] == ' ')
64         {
65             // 產生一個擊鍵消息步驟:按下->抬起
66             keybd_event(VK_SPACE, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
67             keybd_event(VK_SPACE, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
68         }
69         else if (tmp[i] == ',')
70         {
71             keybd_event(VK_OEM_COMMA, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
72             keybd_event(VK_OEM_COMMA, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
73         }
74         else if (tmp[i] >= 'a' && tmp[i] <= 'z')
75         { // 根據字符大小寫切換鍵盤大小寫狀態
76             MySetKeyBig(0);
77             // keybd_event只識別大寫
78             keybd_event((BYTE)tmp[i]-32, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
79             keybd_event((BYTE)tmp[i]-32, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
80         }
81         else if ((tmp[i] >= 'A' && tmp[i] <= 'Z') || (tmp[i] >= '0' && tmp[i] <= '9'))
82         {
83             MySetKeyBig(1);
84             keybd_event((BYTE)tmp[i], NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
85             keybd_event((BYTE)tmp[i], NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
86         }
87         else
88         {
89             keybd_event((BYTE)tmp[i]+64, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
90             keybd_event((BYTE)tmp[i]+64, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
91         }
92     }
93     // 恢復此操作之前的鍵盤狀態
94     MySetKeyBig(bOldState);
95     free(tmp);
96 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM