2016-12-27 46 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')相同,導致輸入值無效。