这是一个 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 项目中。
  • 该模块的实现可能需要根据您的具体环境进行调整。
Node.js 可调用的 C++ 模块:鼠标中键点击监听器

原文地址: https://www.cveoy.top/t/topic/okzc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录