用 Node.js 调用 C++ 模块,实现跨平台鼠标中键点击事件监听
使用 Node.js 调用 C++ 模块实现跨平台鼠标中键点击事件监听
本文将介绍如何在 Electron 环境下,使用 C++ 开发一个可被 Node.js 调用的模块,用于监听跨平台的鼠标中键点击事件。该模块支持添加和移除事件监听器,并提供回调函数获取鼠标坐标。
1. 创建 C++ 模块
创建一个名为 'middleMouse' 的 C++ 模块,并在其中定义两个函数:
- addMiddleMouseClickListener: 用于注册鼠标中键事件的监听器。
- removeMiddleMouseClickListener: 用于移除指定的事件监听器。
使用 std::vector 存储回调函数,在 addMiddleMouseClickListener 中注册鼠标中键事件的监听器,并在回调函数中获取当前鼠标坐标并将其传递给已注册的回调函数。在 removeMiddleMouseClickListener 中移除指定回调函数。
C++ 模块代码:
#include <node.h>
#include <vector>
namespace middleMouse {
// 定义回调函数类型
typedef std::function<void(int, int)> CallbackFunc;
// 定义回调函数列表类型
typedef std::vector<CallbackFunc> CallbackList;
// 存储已注册的回调函数
static CallbackList callbacks;
// 鼠标中键事件的回调函数
static void onMouseButton(int button, int state, int x, int y) {
if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) {
// 遍历所有已注册的回调函数并调用
for (auto callback : callbacks) {
callback(x, y);
}
}
}
// 添加事件监听器
static void addMiddleMouseClickListener(const CallbackFunc& callback) {
// 将回调函数添加到列表中
callbacks.push_back(callback);
}
// 移除事件监听器
static void removeMiddleMouseClickListener(const CallbackFunc& callback) {
// 遍历所有已注册的回调函数,找到并移除指定的回调函数
for (auto it = callbacks.begin(); it != callbacks.end(); ++it) {
if (*it == callback) {
callbacks.erase(it);
break;
}
}
}
// 初始化模块
static void Init(v8::Local<v8::Object> exports) {
// 注册鼠标中键事件的监听器
glutMouseFunc(onMouseButton);
// 将函数导出到 Node.js 中
NODE_SET_METHOD(exports, 'addMiddleMouseClickListener', addMiddleMouseClickListener);
NODE_SET_METHOD(exports, 'removeMiddleMouseClickListener', removeMiddleMouseClickListener);
}
NODE_MODULE(middleMouse, Init)
}
2. Node.js 调用 C++ 模块
在 Node.js 中使用 require('middleMouse') 引入该模块,并调用 addMiddleMouseClickListener 和 removeMiddleMouseClickListener 函数注册和移除事件监听器。在调用回调函数时,使用异步方式避免阻塞主线程。
Node.js 示例代码:
const middleMouse = require('middleMouse');
// 添加事件监听器
middleMouse.addMiddleMouseClickListener((x, y) => {
console.log(`Middle mouse button clicked at (${x}, ${y})`);
});
// 移除事件监听器
middleMouse.removeMiddleMouseClickListener(callbackFunction);
总结
本文介绍了如何使用 C++ 开发一个跨平台鼠标中键点击事件监听模块,并将其与 Node.js 整合。该模块使用 std::vector 存储回调函数,并在回调函数中获取鼠标坐标,并通过异步方式避免阻塞主线程。开发者可以根据实际需求进行调整和扩展。
原文地址: https://www.cveoy.top/t/topic/opdQ 著作权归作者所有。请勿转载和采集!