gpt4 book ai didi

c++ - 使用 node-nan 在 node.js 模块中设置 WindowsHookEx

转载 作者:行者123 更新时间:2023-11-30 05:35:21 27 4
gpt4 key购买 nike

我正在尝试创建一个 Electron node.js 应用程序,它可以使用全局键绑定(bind)执行某些功能。不幸的是,Electron 中的全局键绑定(bind) API 在游戏中不起作用,因此我需要创建一个本地 Node 模块来监听这些低级键事件。

所以我正在使用 node-gyp 与 visual studio 2015 和 nan 一起编译项目,以提供 Node 和 c++ 之间的通信。我已经设法让项目的两个方面分开工作(低级键绑定(bind)和 node.js<-->nan 通信)但我无法将它们组合起来。我也承认我对 c++ 的经验很少(我没有写过一个 c++ 程序)。

#include "node_modules/nan/nan.h"

using namespace std;
using namespace Nan;

HHOOK _hook;
KBDLLHOOKSTRUCT kbdStruct;

class KeyboardEventWorker : public AsyncProgressWorker {
public:
KeyboardEventWorker(Callback *callback, Callback *progress)
: AsyncProgressWorker(callback), progress(progress) {}
~KeyboardEventWorker() {}

LRESULT CALLBACK HookCallback(int nCode,WPARAM wParam,LPARAM lParam) {
executionProgress->Send(reinterpret_cast<const char*>(nCode), sizeof(nCode));
return CallNextHookEx(_hook, nCode, wParam, lParam);
}

void Execute (const AsyncProgressWorker::ExecutionProgress& progress) {
executionProgress = &progress; //PROBLEM #1
_hook = SetWindowsHookEx(13, HookCallback, NULL, 0); //PROBLEM #2

SleepEx(INFINITE, true);
}


void HandleProgressCallback(const char *data, size_t size) {
HandleScope scope;

v8::Local<v8::Value> argv[] = {
New<v8::Integer>(*reinterpret_cast<int*>(const_cast<char*>(data)))
};
progress->Call(1, argv);
}

private:
Callback *progress;
AsyncProgressWorker::ExecutionProgress *executionProgress;
};

NAN_METHOD(DoProgress) {
Callback *progress = new Callback(info[0].As<v8::Function>());
Callback *callback = new Callback(info[1].As<v8::Function>());
AsyncQueueWorker(new KeyboardEventWorker(callback, progress));
}

NAN_MODULE_INIT(Init) {
Set(target
, New<v8::String>("init").ToLocalChecked()
, New<v8::FunctionTemplate>(DoProgress)->GetFunction());
}

NODE_MODULE(asyncprogressworker, Init)

问题 #1:为了能够将消息发送回 node.js,我需要复制 AsyncProgressWorker::ExecutionProgress 的指针并使其对整个类可用,这样当 HookCallback 触发时它可以将消息发送到 Node .js。

编译器不喜欢这样

..\binding.cc(21): error C2440: '=': cannot convert from 'constNan::AsyncProgressWorker::ExecutionProgress *' to 'Nan::AsyncProgressWorker::ExecutionProgress *'[C:\Users\eksrow\gdrive\projects\vscode\node-native-hello-world\build\binding.vcxproj].

..\binding.cc(21): note: Conversion loses qualifiers

格式化:

'const Nan::AsyncProgressWorker::ExecutionProgress *'

'Nan::AsyncProgressWorker::ExecutionProgress *'

我设法通过向私有(private)成员 *executionProgress; 添加关键字 const 来解决这个问题。但我不明白为什么这会解决它,const 变量一旦设置就不应更改。为什么会这样编译?

问题 #2:这个问题很奇怪:

..\binding.cc(22): error C3867: 'KeyboardEventWorker::HookCallback':non-standard syntax; use '&' to create a pointer t o member[C:\Users\eksrow\gdrive\projects\vscode\node-native-hello-world\build\binding.vcxproj]

我在网上查了很多例子,它们的语法都是一样的:

  1. SetWindowsHookEx #1
  2. SetWindowsHookEx #2

关于那一行,我看不出我的代码和他们的代码有什么区别。

如果我按照编译器的指示进行操作并在该行添加一个符号,它会给出一个完全不同的错误:

..\binding.cc(22): error C2276: '&': illegal operation on bound memberfunction expression [C:\Users\eksrow\gdrive\projects\vscode\node-native-hello-world\build\binding.vcxproj]..\binding.cc(22): error C2660: 'SetWindowsHookExA': function does nottake 3 arguments [C:\Users\eksrow\gdrive\projects\vscode\node-native-hello-world\build\binding.vcxproj]

最佳答案

对于问题 #1,您正确地将 const 限定词识别为问题所在。

之所以可以在声明后分配给 const 成员变量,是因为 const 位于 const AsyncProgressWorker::ExecutionProgress *executionProgress。这是一个指向常量 AsyncProgressWorker::ExecutionProgress 的变量指针。这意味着您可以更改指针的值(例如,按照上面的示例重新分配它),但您不能更改它指向的数据。 The top answer of this question对这个概念有很好的解释。

对于问题 #2,错误是由于试图将您的类的成员函数作为函数回调传递而引起的。这是根本不可能的(好吧,没有解决方法......见下文) - 成员方法与函数不同,这是 SetWindowsHookEx 所期望的。您可以将回调函数设为 static,但这样就无法访问 _hook 成员。

Here is an external page对于这个确切的问题有一个(非常hack-y)解决方法。它应该允许您以当前尝试使用它的方式使用 SetWindowsHookEx。但是,我建议重新考虑应用程序的 Hook 方式,看看是否有办法将单个全局函数或静态成员函数注册为应用程序的回调。

与您的问题无关:除非您在示例中省略了代码,否则您永远不会解开 SetWindowsHookEx 中设置的 Hook 。看看 MSDN for UnhookWindowsHookEx .

关于c++ - 使用 node-nan 在 node.js 模块中设置 WindowsHookEx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33928322/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com