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 应用中实现鼠标中键监听功能。

Node.js C++ 鼠标中键监听 - SetWindowsHookEx 和 Lambda 表达式实现

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

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