我想在辅助线程中设置一个钩子,线程对象是一个对象成员,所以我决定传递一个lambda,它通过引用捕获this
,因为对复制构造函数的调用会创建另一个线程导致无限递归。
MyClass() : thread_([this](){
HHOOK kbdHook_LL = SetWindowsHookEx(WH_KEYBOARD_LL, some_func_ptr, 0, 0);
MSG msg;
while(!GetMessage(&msg, NULL, NULL, NULL)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(kbdHook_LL);
return 0;
}) {}
我的问题是我需要some_func_ptr
来了解this
- 对象,因为它还存储处理事件所需的信息。但是我不能使用嵌套的lambda来捕获它,因为只有无捕获的lambdas可以用作函数指针。
some_func_ptr
应如下所示
LRESULT CALLBACK some_func_ptr(int nCode, WPARAM wParam, LPARAM lParam) {
if(nCode == HC_ACTION) {
PKBDLLHOOKSTRUCT pData = (PKBDLLHOOKSTRUCT)lParam;
switch(wParam) {
case WM_KEYDOWN:
//use `this` in some way
break;
case WM_SYSKEYDOWN:
//etc.
break;
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
我对C ++没有经验,特别是在基于C的内核API方面没有经验,因此我不知道如何解决这个问题。