C++ SetWindowsHookExA 错误: 无法将 lambda 表达式转换为 HOOKPROC
这个错误出现在 Windows 编程中,它表示在使用 SetWindowsHookExA 函数时,第二个参数无法转换为 HOOKPROC 类型。
通常,SetWindowsHookExA 函数需要传递一个指向 HOOKPROC 类型函数的指针作为第二个参数,以便在系统级别上安装钩子。但是,在这种情况下,第二个参数被传递了一个 lambda 表达式,该表达式无法直接转换为 HOOKPROC 类型。
解决这个问题的方法是,将 lambda 表达式转换为与 HOOKPROC 类型兼容的函数指针。可以使用 std::function 将 lambda 表达式包装为函数对象,然后使用 std::function::target 函数获取函数指针,最后将其转换为 HOOKPROC 类型。
例如,可以这样做:
#include <functional>
HHOOK hook = SetWindowsHookExA(WH_MOUSE_LL, [](int nCode, WPARAM wParam, LPARAM lParam) -> LRESULT {
// lambda function
return CallNextHookEx(NULL, nCode, wParam, lParam);
}, NULL, 0);
if (hook == NULL) {
// handle error
}
// convert lambda expression to HOOKPROC function pointer
std::function<LRESULT(int, WPARAM, LPARAM)> func = [](int nCode, WPARAM wParam, LPARAM lParam) -> LRESULT {
// lambda function
return CallNextHookEx(NULL, nCode, wParam, lParam);
};
HOOKPROC hookProc = static_cast<HOOKPROC>(func.target<void>());
// install hook using function pointer
HHOOK hook = SetWindowsHookExA(WH_MOUSE_LL, hookProc, NULL, 0);
if (hook == NULL) {
// handle error
}
这里,lambda 表达式被定义为一个匿名函数,并被传递给 SetWindowsHookExA 函数作为第二个参数。然后,使用 std::function 将 lambda 表达式包装为函数对象,并使用 std::function::target 函数获取函数指针。最后,将函数指针转换为 HOOKPROC 类型,并将其传递给 SetWindowsHookExA 函数。
原文地址: https://www.cveoy.top/t/topic/olXW 著作权归作者所有。请勿转载和采集!