2016-12-27 8 views
0

FFI 패키지를 사용하여 nodejs의 Windows 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'은 입력을 하드웨어 입력 대기열에 넣습니다. 이 입력 이벤트가 수집 될 때 전경에있는 윈도우 (또는 스레드)가 입력을받습니다. 따라서 응용 프로그램을 시작할 때 자연스럽게 메모장은 전경 창이 아닙니다. 어쨌든 당신이 설명한 것은 당신이 제안한 해결책입니다. 이제 ** 문제 **는 정말로 해결하려고합니까? – IInspectable

+0

아무도 최종 목표로 메모장에 가짜 입력을했습니다. 당신은 정말로 무엇을하려고합니다. 아마도 당신이 그것을 가짜로 만들 수 있다고해도 나는 당신의 진정한 목표가 똑같은 방식으로 해결되지는 못한다는 것을 메모장에 전한다. –

+0

@IInspectable 현재 활성 창에 단추 (키보드)를 클릭하는 프로그램을 작성하려고합니다. 간격으로 그것은 기본적으로 자동 clicker 같다. – alphuite

답변

0

"1"은 실제로 이벤트가 아닌 1 개의 이벤트가 삽입되었음을 알려줍니다. FFI에 대해서는 잘 모르지만 keyboardInput에 잘못된 유형 정의가있는 것 같습니다. wVK와 wScan은 16 비트 정수 여야합니다 (따라서 WORD는 'w'입니다). 그것들은 dwFlags ('int')와 똑같이 입력되기 때문에 입력 값이 유효하지 않습니다.