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 模拟键盘

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

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