如果在lua中左键单击ffi
Posted
技术标签:
【中文标题】如果在lua中左键单击ffi【英文标题】:If Left click ffi in lua 【发布时间】:2021-10-26 03:34:00 【问题描述】:我是 ffi 的新手。
基本上我试图在单击鼠标左键时得到一个布尔值。
我做了一些研究,发现了一个叫WM_LBUTTONDOWN
的东西
但是我不知道如何把它放在ffi.cdef
然后得到一个布尔值。
【问题讨论】:
你有响应用户输入的窗口吗? @IInspectable - 您可以发布一个答案,展示如何创建这样一个窗口。 我可以(好吧,如果不阅读 Lua 的 FFI,我不能),但这将是一个不同问题的答案。 【参考方案1】:此程序每 1 ms 轮询一次鼠标按钮状态,并在按下 LMB 时退出
local ffi = require("ffi")
ffi.cdef[[
short GetAsyncKeyState(int vKey);
void Sleep(int ms);
]]
local function is_key_down(vKey)
return ffi.C.GetAsyncKeyState(vKey) < 0
end
local function sleep(ms)
ffi.C.Sleep(ms or 1)
end
local VK_LBUTTON = 0x01 -- Left mouse button
local VK_RBUTTON = 0x02 -- Right mouse button
local VK_MBUTTON = 0x04 -- Middle mouse button
local VK_XBUTTON1 = 0x05 -- X1 mouse button (Back)
local VK_XBUTTON2 = 0x06 -- X2 mouse button (Forward)
sleep(1000)
print"Waiting for Left Mouse Button pressed"
repeat
sleep()
until is_key_down(VK_LBUTTON)
print"Left Mouse Button is down now"
如果您想处理 WM_LBUTTONDOWN 消息,那将是一个更复杂的解决方案。
【讨论】:
除非sleep()
被实现为忙等待,否则没有理由假设代码每1ms 轮询一次。如果它确实使用了一个繁忙的循环,那么甚至没有实际理由调用它。
@IInspectable - 是的,sleep()
中低于一个时间片的时间间隔取决于实现。但是对于人类可控的鼠标来说,低于 20 毫秒的一切都很好。
人类不是输入事件的唯一来源。毕竟有SendInput
,而这个提议的解决方案很可能会错过这些事件。
@IInspectable - 你可能会因为生成SendInput
的速度比人类按下鼠标按钮的速度快而在任何游戏服务器上被禁止 :-)
我怀疑您是否会因为使用触摸屏与按钮进行交互而被游戏服务器禁止。此外,游戏并不是唯一接受输入的程序类型。问题中没有具体的游戏内容。以上是关于如果在lua中左键单击ffi的主要内容,如果未能解决你的问题,请参考以下文章
LuaJIT ffi cdata 和 Torch Tensor 之间的最佳转换
如何使用 cffi-lua 向/从 C 函数传递 Lua 表