Node.js 可调用的 C++ 模块:鼠标中键点击监听器
这是一个 Node.js 可调用的 C++ 模块,用于在 Electron 环境下监听鼠标中键点击事件,并通过 Node.js 回调 JavaScript 代码。该模块兼容 Linux、Windows 和 macOS 系统。
功能:
- 接收 PC 端鼠标中键按下的事件
- 兼容 Linux,Windows 和 macOS 系统
- 通过 Node.js 注册事件来回调 JavaScript 代码
- 注册函数为
addMiddleMouseClickListener - 支持移除某个注册函数
removeMiddleMouseClickListener - 允许多次注册这个事件,当鼠标中键按钮按下时一次调用这些回调函数,如果没注册则不响应
使用示例:
C++ 模块代码:
#include <node.h>
#include <uv.h>
#ifdef _WIN32
#include <windows.h>
#else
#include <X11/Xlib.h>
#endif
namespace {
// 事件循环
uv_loop_t* loop;
// 异步通知句柄
uv_async_t async;
// 鼠标中键按下回调函数
void (*middleMouseClickCallback)();
// 监听鼠标中键按下事件的线程
void ListenMiddleMouseClick(uv_async_t* handle) {
#ifdef _WIN32
if (GetAsyncKeyState(VK_MBUTTON) & 0x8000) {
// 鼠标中键按下
if (middleMouseClickCallback) {
middleMouseClickCallback();
}
}
#else
Display* display = XOpenDisplay(NULL);
if (display) {
// 检查鼠标中键是否按下
char keys[32];
XQueryKeymap(display, keys);
if (keys[2] & 0x20) {
// 鼠标中键按下
if (middleMouseClickCallback) {
middleMouseClickCallback();
}
}
XCloseDisplay(display);
}
#endif
}
// 注册鼠标中键按下事件回调函数
void AddMiddleMouseClickListener(const v8::FunctionCallbackInfo<v8::Value>& args) {
if (args.Length() < 1 || !args[0]->IsFunction()) {
return;
}
v8::Isolate* isolate = args.GetIsolate();
middleMouseClickCallback = [isolate, callback = v8::Persistent<v8::Function, v8::CopyablePersistentTraits<v8::Function>>(isolate, v8::Local<v8::Function>::Cast(args[0]))]() {
v8::HandleScope scope(isolate);
callback.Get(isolate)->Call(isolate->GetCurrentContext(), v8::Null(isolate), 0, nullptr);
};
}
// 移除鼠标中键按下事件回调函数
void RemoveMiddleMouseClickListener(const v8::FunctionCallbackInfo<v8::Value>& args) {
middleMouseClickCallback = nullptr;
}
// 初始化模块
void InitModule(v8::Local<v8::Object> exports) {
// 初始化事件循环
loop = uv_default_loop();
// 初始化异步通知句柄
uv_async_init(loop, &async, ListenMiddleMouseClick);
// 导出函数
NODE_SET_METHOD(exports, 'addMiddleMouseClickListener', AddMiddleMouseClickListener);
NODE_SET_METHOD(exports, 'removeMiddleMouseClickListener', RemoveMiddleMouseClickListener);
}
}
NODE_MODULE(middle_mouse_click, InitModule);
Electron 中使用模块的示例代码:
const { app, BrowserWindow } = require('electron');
const middleMouseClick = require('./build/Release/middle_mouse_click');
// 创建窗口
let mainWindow = null;
function createWindow() {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
},
});
mainWindow.loadFile('index.html');
mainWindow.on('closed', () => {
mainWindow = null;
});
}
// 注册鼠标中键按下事件回调函数
middleMouseClick.addMiddleMouseClickListener(() => {
console.log('middle mouse click');
});
// 移除鼠标中键按下事件回调函数
setTimeout(() => {
middleMouseClick.removeMiddleMouseClickListener();
}, 5000);
// 启动应用程序
app.on('ready', () => {
createWindow();
});
注意:
- 该模块使用
uv_async_init实现非阻塞事件监听,避免阻塞主线程。 - 该示例代码展示了如何在 Electron 中使用该模块,您也可以将其移植到其他 Node.js 项目中。
- 在使用该模块之前,您需要编译 C++ 代码并将其链接到您的 Node.js 项目中。
- 该模块的实现可能需要根据您的具体环境进行调整。
原文地址: https://www.cveoy.top/t/topic/okzc 著作权归作者所有。请勿转载和采集!