从Node.js调用Windows SetWinEventHook [英] Call Windows SetWinEventHook from nodejs
问题描述
我正在尝试致电 SetWinEventHook ,如此处针对C#所述,但来自nodejs.
I'm trying to call SetWinEventHook as described here for C# but from nodejs.
我正在使用 ffi-napi 绑定到功能.到目前为止,这是我的代码:
I'm using ffi-napi to bind to the function. Here's my code so far:
const ffi = require("ffi-napi")
const user32 = ffi.Library("user32", {
SetWinEventHook: ["int", ["int", "int", "pointer", "pointer", "int", "int", "int"]]
})
const pfnWinEventProc = ffi.Callback("void", ["pointer", "int", "pointer", "long", "long", "int", "int"],
function (hWinEventHook, event, hwnd, idObject, idChild, idEventThread, dwmsEventTime) {
console.log("Callback!")
console.log(arguments)
})
const EVENT_SYSTEM_FOREGROUND = 3
const WINEVENT_OUTOFCONTEXT = 0
const WINEVENT_SKPIOWNPROCESS = 2
user32.SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, null, pfnWinEventProc,
0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKPIOWNPROCESS)
setInterval(function () {
// keep the script alive
}, 500)
process.on("exit", function () {
console.log("Exiting")
pfnWinEventProc
})
问题仅仅是我的回调没有被调用.每当更改焦点窗口时都应调用它.
The problem is simply my callback is not being called. It should be called whenever the focused window is changed.
我也没有收到任何错误,所以我对自己在这里做错的事情很迷茫.
I'm not getting any errors either so I'm quite lost as to what I'm doing wrong here.
代码位于此处以及要查看的地方.
The code is here as well if you want to check it out.
推荐答案
我终于使用主动双赢软件包的Windows部分.
I finally got it working using a combination of the cluster module (if you don't want to block the event loop with the message loop) and peeking at the Windows part of the active-win package.
完整代码位于此处.
const ffi = require("ffi-napi")
const cluster = require("cluster")
const ref = require("ref")
const wchar = require("ref-wchar")
if (cluster.isMaster) {
console.log("Main code here...")
cluster.fork()
} else {
const msgType = ref.types.void
const msgPtr = ref.refType(msgType)
const EVENT_SYSTEM_FOREGROUND = 3
const WINEVENT_OUTOFCONTEXT = 0
const WINEVENT_SKPIOWNPROCESS = 2
const user32 = ffi.Library("user32", {
SetWinEventHook: ["int", ["int", "int", "pointer", "pointer", "int", "int", "int"]],
GetWindowTextW: ["int", ["pointer", "pointer", "int"]],
GetWindowTextLengthW: ["int", ["pointer"]],
GetMessageA: ["bool", [msgPtr, "int", "uint", "uint"]]
})
function getMessage() {
return user32.GetMessageA(ref.alloc(msgPtr), null, 0, 0)
}
const pfnWinEventProc = ffi.Callback("void", ["pointer", "int", "pointer", "long", "long", "int", "int"],
function (hWinEventHook, event, hwnd, idObject, idChild, idEventThread, dwmsEventTime) {
const windowTitleLength = user32.GetWindowTextLengthW(hwnd)
const bufferSize = windowTitleLength * 2 + 4
const titleBuffer = Buffer.alloc(bufferSize)
user32.GetWindowTextW(hwnd, titleBuffer, bufferSize)
const titleText = ref.reinterpretUntilZeros(titleBuffer, wchar.size)
const finallyWindowTitle = wchar.toString(titleText)
console.log(finallyWindowTitle)
}
)
user32.SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, null, pfnWinEventProc,
0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKPIOWNPROCESS)
let res = getMessage()
while(res != 0) {
switch (res) {
case -1:
console.log("Invalid GetMessageA arguments or something!");
break
default:
console.log("Got a message!")
}
res = getMessage()
}
}
这篇关于从Node.js调用Windows SetWinEventHook的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!