調用 SendInput 模擬 ESC 鍵時,若省略 memset 初始化,或改用非數組變量 INPUT iput 而未清零,會導致 ki.dwFlags 字段包含隨機垃圾值,從而觸發非預期行為(如被誤判為 KEYUP、SCANCODE 或 UNICODE 模式),導致按鍵模擬失效。
KEYBDINPUT.dwFlags| 標誌位常量 | 含義 | 若意外為 1 的後果 |
|---|---|---|
KEYEVENTF_KEYUP (0x0002) | 按鍵釋放 | 系統認為是「鬆開 ESC」,而非按下 |
KEYEVENTF_SCANCODE (0x0008) | 使用掃描碼而非虛擬鍵碼 | wVk 被忽略,需填寫 wScan |
KEYEVENTF_UNICODE (0x0004) | 發送 Unicode 字符 | wVk 被忽略,wScan 視為 Unicode 碼點 |
INPUT input = {0}; // C++11 聚合初始化全零(推薦)
// 或
INPUT input;
ZeroMemory(&input, sizeof(INPUT)); // 兼容舊標準
// 或
memset(&input, 0, sizeof(INPUT)); // C 風格
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_ESCAPE; // 虛擬鍵碼
input.ki.dwFlags = 0; // 明確設置為按下事件(可省略,因已清零)
SendInput(1, &input, sizeof(INPUT));
INPUT iput[1] 配合 memset 就正常?memset(iput, 0, sizeof(INPUT)) 將整個數組(即單個 INPUT)內存清零,確保 dwFlags=0,即標準「按下虛擬鍵」語義。去掉 memset 或改用未初始化的單變量,dwFlags 含隨機值,極大概率觸發上述非預期標誌位。
INPUT 結構體進行全零初始化(INPUT input = {0}; 最簡潔安全)。type、ki.wVk),其餘依賴零值默認語義。INPUT,第二個設置 dwFlags = KEYEVENTF_KEYUP。