Чем заменить setVirtualKeyDown?

Shelok_Kholmes

Известный
Автор темы
449
68
Версия MoonLoader
Другое
Чем заменить setVirtualKeyDown чтоб оно считывалось скриптом keyboard.lua?
 
Решение
setVirtualKeyDown эмулирует нажатие только внутри игрового движка. keyboard.lua использует встроенные функции MoonLoader isKeyDown и isKeyJustPressed.
Чтобы инпут долетал и засчитывался в keyboard.lua, нужно слать нажатия на уровне WinAPI через FFI.


Lua:
local ffi = require 'ffi'

ffi.cdef[[
   void keybd_event(unsigned char bVk, unsigned char bScan, unsigned long dwFlags, unsigned long dwExtraInfo);
]]

local KEYEVENTF_KEYUP = 0x0002

-- Функция для полной эмуляции клика
function simulate_key(vkey, delay)
   ffi.C.keybd_event(vkey, 0, 0, 0) -- зажали
   if delay then
      wait(delay)
   end
   ffi.C.keybd_event(vkey, 0, KEYEVENTF_KEYUP, 0) -- отпустили
end
Как использовать:

Lua:
-- Зажать кнопку (например, W = 0x57)...

XRLM

Против ветра рождённый
Модератор
1,693
1,395
setVirtualKeyDown эмулирует нажатие только внутри игрового движка. keyboard.lua использует встроенные функции MoonLoader isKeyDown и isKeyJustPressed.
Чтобы инпут долетал и засчитывался в keyboard.lua, нужно слать нажатия на уровне WinAPI через FFI.


Lua:
local ffi = require 'ffi'

ffi.cdef[[
   void keybd_event(unsigned char bVk, unsigned char bScan, unsigned long dwFlags, unsigned long dwExtraInfo);
]]

local KEYEVENTF_KEYUP = 0x0002

-- Функция для полной эмуляции клика
function simulate_key(vkey, delay)
   ffi.C.keybd_event(vkey, 0, 0, 0) -- зажали
   if delay then
      wait(delay)
   end
   ffi.C.keybd_event(vkey, 0, KEYEVENTF_KEYUP, 0) -- отпустили
end
Как использовать:

Lua:
-- Зажать кнопку (например, W = 0x57)
ffi.C.keybd_event(0x57, 0, 0, 0)

-- Отпустить кнопку
ffi.C.keybd_event(0x57, 0, 2, 0) -- 2 это KEYEVENTF_KEYUP
так же setVirtualKeyDown:
1780969815707.png

p.s SendInput это современная замена keybd_event, а так же более надежная и более функциональная
 
  • Нравится
Реакции: Shelok_Kholmes и Tema05