Node.js C++ 鼠标中键监听 - SetWindowsHookEx 和 Lambda 表达式实现
Node.js C++ 鼠标中键监听 - SetWindowsHookEx 和 Lambda 表达式实现
本文介绍如何使用 Node.js C++ 结合 SetWindowsHookEx 监听鼠标中键按下事件,并利用 Lambda 表达式简化代码。
代码示例
以下是通过 SetWindowsHookEx 监听鼠标中键按钮按下的 Node.js C++ 代码,使用 lambda 表达式写法:
#include <napi.h>
#include <windows.h>
HHOOK g_hook;
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode >= 0) {
if (wParam == WM_MBUTTONDOWN) {
Napi::Env env = Napi::Env::Default();
Napi::Object eventObj = Napi::Object::New(env);
eventObj.Set('type', 'mousedown');
eventObj.Set('button', 'middle');
Napi::Function callback = env.Global().Get('onMouseEvent').As<Napi::Function>();
callback.Call({eventObj});
}
}
return CallNextHookEx(g_hook, nCode, wParam, lParam);
}
Napi::Value StartHook(const Napi::CallbackInfo& info) {
g_hook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, GetModuleHandle(NULL), 0);
return Napi::Boolean::New(info.Env(), g_hook != NULL);
}
Napi::Value StopHook(const Napi::CallbackInfo& info) {
if (g_hook) {
UnhookWindowsHookEx(g_hook);
g_hook = NULL;
}
return Napi::Boolean::New(info.Env(), true);
}
Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, 'startHook'), Napi::Function::New(env, StartHook));
exports.Set(Napi::String::New(env, 'stopHook'), Napi::Function::New(env, StopHook));
return exports;
}
NODE_API_MODULE(NODE_GYP_MODULE_NAME, Init)
其中,MouseHookProc 函数是钩子过程函数,当检测到鼠标中键按钮按下时,会通过 onMouseEvent 回调函数向 Node.js 发送事件。在 StartHook 函数中,使用 SetWindowsHookEx 函数注册钩子,然后在 StopHook 函数中取消钩子注册。
Node.js 使用方法
在 Node.js 中,可以通过以下方式调用 C++ 模块中的函数:
const { startHook, stopHook } = require('./build/Release/mousehook.node');
function onMouseEvent(event) {
console.log(event); // { type: 'mousedown', button: 'middle' }
}
startHook();
global.onMouseEvent = onMouseEvent;
process.on('exit', () => {
stopHook();
});
说明
- 本示例代码使用了
napi.h头文件,它提供了一个 Node.js C++ 扩展的 API。 SetWindowsHookEx函数用于注册钩子,WH_MOUSE_LL指定监听的是全局鼠标事件。MouseHookProc函数是钩子过程函数,它会收到所有鼠标事件。WM_MBUTTONDOWN表示鼠标中键按下事件。- 当鼠标中键按下时,
MouseHookProc函数会将事件信息封装成一个对象,并通过onMouseEvent回调函数传递给 Node.js。 StartHook函数用于启动钩子,StopHook函数用于停止钩子。- 在 Node.js 中,通过
require加载 C++ 模块,并调用startHook函数启动钩子,stopHook函数停止钩子。 - 为了确保在程序退出时停止钩子,需要在
process.on('exit', ...)中调用stopHook函数。
总结
本文展示了如何使用 Node.js C++ 结合 SetWindowsHookEx 监听鼠标中键按下事件,并利用 Lambda 表达式简化代码。希望本文能够帮助您在 Node.js 应用中实现鼠标中键监听功能。
原文地址: https://www.cveoy.top/t/topic/olXr 著作权归作者所有。请勿转载和采集!