lua windows 模拟键盘
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")
原文地址: https://www.cveoy.top/t/topic/bxr6 著作权归作者所有。请勿转载和采集!