首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言 keybd_event 模擬鍵盤輸入實現打開記事本

     編輯:程式設計綜合問答

功能描述

使用 Windows API keybd_event 模擬鍵盤按鍵,實現:

  1. Win + R 打開「運行」對話框
  2. 輸入 "notepad"
  3. 按 Enter 執行

完整代碼

#include <windows.h>
#include <stdio.h>

void main() {
    // 模擬 Win + R
    keybd_event(0x5B, 0, 0, 0);      // 左 Win 鍵按下
    keybd_event('R', 0, 0, 0);       // R 鍵按下
    keybd_event('R', 0, 2, 0);       // R 鍵釋放
    keybd_event(0x5B, 0, 2, 0);      // 左 Win 鍵釋放

    char str[] = "notepad";
    int i = 0;
    Sleep(1000);  // 等待運行框彈出

    // 逐字符輸入 notepad
    while (str[i]) {
        // 字母鍵需模擬 Shift + 字母(大寫)或直接發送虛擬鍵碼
        // 這裡簡化處理:假設輸入小寫,實際需根據鍵盤佈局發送正確掃描碼
        keybd_event(str[i] - 32, 0, 0, 0);  // 按下(大寫碼)
        keybd_event(str[i] - 32, 0, 2, 0);  // 釋放
        i++;
    }

    Sleep(1000);

    // 模擬 Enter 執行
    keybd_event(VK_RETURN, 0, 0, 0);
    keybd_event(VK_RETURN, 0, 2, 0);
    keybd_event(VK_RETURN, 0, 0, 0);  // 雙重發送確保觸發
    keybd_event(VK_RETURN, 0, 2, 0);
}

關鍵點解析

參數含義
bVk虛擬鍵碼(如 VK_RETURN, 'R', 0x5B 左 Win)
bScan硬件掃描碼,通常設 0 由系統映射
dwFlags0=按下, 2=釋放, 1=擴展鍵
dwExtraInfo額外信息,通常 0

注意事項與改進建議

  1. 大小寫處理:代碼中 str[i] - 32 假設 ASCII 字母大小寫差 32,僅適用於美式鍵盤佈局。實際應使用 VkKeyScanEx 獲取正確虛擬鍵碼與 Shift 狀態
  2. 輸入法干擾:中文輸入法啟用時可能導致字符輸入異常,建議先切換至英文輸入法
  3. 更現代的替代方案:SendInput API 功能更強、支持更多輸入類型,推薦新項目使用
  4. 權限問題:目標窗口權限高於當前進程時模擬輸入會失敗(UIPI 機制)
  5. 延時調整:Sleep 時間需根據機器性能調整,過短導致輸入丟失

進階:使用 SendInput 重寫

INPUT inputs[2] = {};
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_LWIN;
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = 'R';
inputs[1].ki.dwFlags = KEYEVENTF_KEYUP;
// ... 發送組合鍵、字符串、回車
SendInput(2, inputs, sizeof(INPUT));
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved