2016-12-27 67 views
0

我想使用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”,不应该意味着它的作品?因为我打开记事本时没有按下按键。

+0

'SendInput'将输入放入硬件输入队列中。无论哪个窗口(或线程,真的)在获取该输入事件时在前台都会收到输入。所以当你启动你的应用程序时,Notepad自然不是前台窗口。无论如何,你所描述的是你提出的解决方案。现在你真的想解决什么**问题? – IInspectable

+0

没有人伪造输入记事本作为最终目标。你真的想做什么。很可能,即使你能伪造它,我也不会以同样的方式解决你的真正目标。 –

+0

@IInspectable我正试图编写一个程序,该程序可以将按钮(在键盘上)点击到当前活动窗口中。随着时间间隔,它基本上就像一个自动点击器。 – alphuite

回答

0

“1”告诉你插入了1个事件,而不是事件的实际内容。我不知道FFI,但在我看来keyboardInput有一些无效的类型定义。 wVK和wScan必须是16位整数(因此WORD为'w')。因为它们的键入方式与dwFlags(一个'int')相同,导致输入值无效。