在Node-FFI中使用SendInput
问题描述:
我想使用FFI包中的nodejs中的窗口Api使用SendInput函数。在Node-FFI中使用SendInput
我的C知识是有限的,所以我不能真正弄清楚我有什么问题, 我基本上试图按下键盘上的某个键。
这是我的代码有:
var ffi = require('ffi');
var ref = require ('ref');
var struct = require ('ref-struct');
var keyboardInput = struct({
'type': 'int',
'wVK': 'int',
'wScan': 'int',
'dwFlags': 'int',
'time': 'int',
'dwExtraInfo': 'int64'
});
var keyboardInputPtr = ref.refType(keyboardInput);
var keyboard = new keyboardInput();
keyboard.type = 1;
keyboard.wVK = 0x41;
keyboard.wScan = 0;
keyboard.dwFlags = 2;
keyboard.time = 0;
keyboard.dwExtraInfo = 0;
var user32 = ffi.Library('user32', {
'SendInput': [ 'int', [ 'uint', keyboardInputPtr, 'int' ] ]
});
setInterval(function(){
var r = user32.SendInput(1, keyboard.ref(), 40);
console.log(r);
}, 500);
它记录了我在控制台中的“1”,不应该意味着它的作品?因为我打开记事本时没有按下按键。
答
“1”告诉你插入了1个事件,而不是事件的实际内容。我不知道FFI,但在我看来keyboardInput有一些无效的类型定义。 wVK和wScan必须是16位整数(因此WORD为'w')。因为它们的键入方式与dwFlags(一个'int')相同,导致输入值无效。
'SendInput'将输入放入硬件输入队列中。无论哪个窗口(或线程,真的)在获取该输入事件时在前台都会收到输入。所以当你启动你的应用程序时,Notepad自然不是前台窗口。无论如何,你所描述的是你提出的解决方案。现在你真的想解决什么**问题? – IInspectable
没有人伪造输入记事本作为最终目标。你真的想做什么。很可能,即使你能伪造它,我也不会以同样的方式解决你的真正目标。 –
@IInspectable我正试图编写一个程序,该程序可以将按钮(在键盘上)点击到当前活动窗口中。随着时间间隔,它基本上就像一个自动点击器。 – alphuite