Lua 中可以使用 WinAPI 函数模拟键盘输入,以下是一个示例代码:

local ffi = require("ffi")
ffi.cdef[[ 
    typedef struct tagKEYBDINPUT { 
        unsigned short wVk; 
        unsigned short wScan; 
        unsigned int   dwFlags; 
        unsigned int   time; 
        void*          dwExtraInfo; 
    } KEYBDINPUT, *PKEYBDINPUT, *LPKEYBDINPUT; 

    typedef struct tagINPUT { 
        unsigned int type; 
        union { 
            KEYBDINPUT    ki; 
        } d; 
    } INPUT, *PINPUT, *LPINPUT; 

    void Sleep(unsigned int dwMilliseconds); 
    unsigned int SendInput(unsigned int nInputs, LPINPUT pInputs, int cbSize); 
    unsigned int MapVirtualKeyA(unsigned int uCode, unsigned int uMapType); 
]]

local VK = { 
    ["BACKSPACE"] = 0x08, 
    ["TAB"] = 0x09, 
    ["ENTER"] = 0x0D, 
    ["SHIFT"] = 0x10, 
    ["CONTROL"] = 0x11, 
    ["ALT"] = 0x12, 
    ["CAPSLOCK"] = 0x14, 
    ["ESCAPE"] = 0x1B, 
    ["SPACE"] = 0x20, 
    ["PAGEUP"] = 0x21, 
    ["PAGEDOWN"] = 0x22, 
    ["END"] = 0x23, 
    ["HOME"] = 0x24, 
    ["LEFT"] = 0x25, 
    ["UP"] = 0x26, 
    ["RIGHT"] = 0x27, 
    ["DOWN"] = 0x28, 
    ["INSERT"] = 0x2D, 
    ["DELETE"] = 0x2E, 
    ["0"] = 0x30, 
    ["1"] = 0x31, 
    ["2"] = 0x32, 
    ["3"] = 0x33, 
    ["4"] = 0x34, 
    ["5"] = 0x35, 
    ["6"] = 0x36, 
    ["7"] = 0x37, 
    ["8"] = 0x38, 
    ["9"] = 0x39, 
    ["A"] = 0x41, 
    ["B"] = 0x42, 
    ["C"] = 0x43, 
    ["D"] = 0x44, 
    ["E"] = 0x45, 
    ["F"] = 0x46, 
    ["G"] = 0x47, 
    ["H"] = 0x48, 
    ["I"] = 0x49, 
    ["J"] = 0x4A, 
    ["K"] = 0x4B, 
    ["L"] = 0x4C, 
    ["M"] = 0x4D, 
    ["N"] = 0x4E, 
    ["O"] = 0x4F, 
    ["P"] = 0x50, 
    ["Q"] = 0x51, 
    ["R"] = 0x52, 
    ["S"] = 0x53, 
    ["T"] = 0x54, 
    ["U"] = 0x55, 
    ["V"] = 0x56, 
    ["W"] = 0x57, 
    ["X"] = 0x58, 
    ["Y"] = 0x59, 
    ["Z"] = 0x5A, 
}

local function keyDown(key) 
    local input = ffi.new("INPUT") 
    input.type = 1 -- INPUT_KEYBOARD 
    input.d.ki.wVk = VK[key] or string.byte(key) 
    input.d.ki.wScan = ffi.C.MapVirtualKeyA(input.d.ki.wVk, 0) 
    input.d.ki.dwFlags = 0 -- KEYEVENTF_KEYDOWN 
    ffi.C.SendInput(1, input, ffi.sizeof(input)) 
end

local function keyUp(key) 
    local input = ffi.new("INPUT") 
    input.type = 1 -- INPUT_KEYBOARD 
    input.d.ki.wVk = VK[key] or string.byte(key) 
    input.d.ki.wScan = ffi.C.MapVirtualKeyA(input.d.ki.wVk, 0) 
    input.d.ki.dwFlags = 2 -- KEYEVENTF_KEYUP 
    ffi.C.SendInput(1, input, ffi.sizeof(input)) 
end

local function keyPress(key, delay) 
    delay = delay or 50 
    keyDown(key) 
    ffi.C.Sleep(delay) 
    keyUp(key) 
end

-- 示例:模拟按下 Ctrl+C 
keyDown("CONTROL") 
keyPress("C") 
keyUp("CONTROL")
Lua Windows 模拟键盘输入 - 使用 WinAPI 函数

原文地址: https://www.cveoy.top/t/topic/m1pv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录