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

C語言模擬鍵盤輸入:Windows API SendInput/keybd_event 詳解

     編輯:C 語言問答

C語言實現模擬擊鍵:SendInput 與 keybd_event 兩種 Windows API 方案

VB 有 SendKeys,C 語言在 Windows 下需調用系統 API 實現模擬鍵盤/鼠標輸入。主要有兩種方式:現代推薦 SendInput,舊式 keybd_event(已棄用但仍廣泛使用)。

方案一:SendInput(推薦,支持鍵盤/鼠標/硬件輸入)


#define _WIN32_WINNT 0x0501 // 需 XP 以上
#include <windows.h>

// 模擬按下並釋放一個虛擬鍵
void PressKey(WORD vk) {
    INPUT input[2] = {0};
    // 按下
    input[0].type = INPUT_KEYBOARD;
    input[0].ki.wVk = vk;
    // 釋放
    input[1].type = INPUT_KEYBOARD;
    input[1].ki.wVk = vk;
    input[1].ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(2, input, sizeof(INPUT));
}

// 模擬輸入字符串(逐字符發送)
void TypeString(const char *str) {
    for (int i = 0; str[i]; i++) {
        // 簡化:僅處理 ASCII 可見字符,實際需處理 Shift 組合鍵
        INPUT input[2] = {0};
        input[0].type = INPUT_KEYBOARD;
        input[0].ki.wScan = str[i];
        input[0].ki.dwFlags = KEYEVENTF_UNICODE;
        input[1] = input[0];
        input[1].ki.dwFlags |= KEYEVENTF_KEYUP;
        SendInput(2, input, sizeof(INPUT));
        Sleep(10); // 適當延遲
    }
}

int main() {
    Sleep(3000); // 留 3 秒切換到目標窗口
    PressKey(VK_RETURN); // 模擬 Enter
    TypeString("Hello from C!");
    return 0;
}

方案二:keybd_event(舊 API,簡單但不推薦新代碼使用)


#include <windows.h>

#define KEYDOWN(vk) (keybd_event(vk, 0, 0, 0), Sleep(50))
#define KEYUP(vk)   (keybd_event(vk, 0, KEYEVENTF_KEYUP, 0), Sleep(50))

void PressKeyOld(WORD vk) {
    KEYDOWN(vk);
    KEYUP(vk);
}

int main() {
    Sleep(3000);
    PressKeyOld(VK_F5); // 模擬 F5 刷新
    return 0;
}

關鍵區別與選擇建議

特性SendInputkeybd_event
推薦程度✅ 現代標準❌ 已棄用
輸入類型鍵盤/鼠標/硬件僅鍵盤
Unicode 支持原生支持 (KEYEVENTF_UNICODE)需配合 MapVirtualKey
同步性插入輸入流,按順序處理直接發送,可能繞過某些攔截
權限要求同桌面進程同桌面進程

常見應用場景與注意事項

  • 自動化測試:配合 FindWindow/SetForegroundWindow 定位目標窗口。
  • 遊戲輔助/腳本:警告:多數遊戲有反作弊(检测 SendInput/keybd_event、驅動級攔截),使用可能導致封號,且涉及灰色地帶。
  • 無障礙工具:輔助殘障人士輸入,屬正當用途。
  • 權限問題:目標窗口若以管理員運行,模擬進程也需管理員權限(UAC 隔離)。
  • 焦點搶奪:模擬前務必 SetForegroundWindow,否則輸入發送到當前活動窗口。

控制台程序入口點說明

原回答提到“主函數入口 int WINAPI WinMain,選擇控制台 win32 console application”有誤:

  • 控制台程序:入口為 int main() 或 int wmain(),項目類型選 “Windows Console Application”。
  • GUI 程序:入口為 int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int),項目類型選 “Windows Desktop Application”。
  • 模擬輸入代碼在兩類程序中均可調用,無需 GUI 入口。

編譯鏈接


gcc simulate_keys.c -o simulate_keys -luser32
// 或 MSVC 項目屬性 -> 鏈接器 -> 輸入 -> 附加依賴項添加 user32.lib

總結

C 語言模擬擊鍵首選 SendInput,功能強、標準化、支持 Unicode。嚴禁用於惡意自動化、遊戲外掛等違規場景。學習重點在於理解 Windows 輸入模型、INPUT 結構體填充、虛擬鍵碼與掃描碼映射、進程間輸入隔離機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved