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 }