C++ 为什么SetWindowsHookEx不接受钩子过程?
我正在尝试创建一个dll,在这里我可以用来监视所有系统事件进程创建、销毁等。这是我到目前为止得出的结论: DLL main-我的DLL的入口点:C++ 为什么SetWindowsHookEx不接受钩子过程?,c++,visual-c++,hook,setwindowshookex,C++,Visual C++,Hook,Setwindowshookex,我正在尝试创建一个dll,在这里我可以用来监视所有系统事件进程创建、销毁等。这是我到目前为止得出的结论: DLL main-我的DLL的入口点: // dllmain.cpp : Defines the entry point for the DLL application. #include "stdafx.h" #include "CBTHook.h" BOOL APIENTRY DllMain( HMODULE hModule,
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#include "CBTHook.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CBT::CBTHook::SetHandle(hModule);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
DLL头文件
CBTHook.cpp
现在的问题是,SetWindowsHookEx不会接受HookProcedure,而据我在网上阅读和看到的,所讨论的函数的返回值是正确的。我得到一个错误:
错误C3867:'CBT::CBTHook::HookProcedure':函数调用缺少参数列表;使用“&CBT::CBTHook::HookProcedure”创建指向成员的指针
按照上面的建议去做也不能解决问题
这里缺少什么?钩子过程必须是自由函数或静态类方法。如果您想调用一个类实例方法,您需要将该调用封装在上述方法之一中 编辑: 要设置钩子,不需要类。这是一个基本的例子。其他所有问题都源于对类的使用。如果您想使用一个类,请确保您知道如何使用它。如果你不确定,C++不是java。如果一个类在没有任何限制的情况下可以完美地工作,那么就不需要使用它 例如:
#include "stdafx.h"
HHOOK hHook;
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
hHook = SetWindowsHookEx(WH_CBT, HookProcedure, hModule, 0);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
LRESULT CALLBACK HookProcedure(int nCode, WPARAM wparam, LPARAM lparam)
{
if (nCode >= 0)
{
switch (nCode)
{
case HCBT_CREATEWND:
cout << "Created!~" << endl;
break;
case HCBT_DESTROYWND:
cout << "Destroied!~" << endl;
break;
default:
cout << "sth else" << endl;
break;
}
}
else
return CallNextHookEx(hHook, nCode, wparam, lparam);
}
钩子过程必须是自由函数或静态类方法。如果您想调用一个类实例方法,您需要将该调用封装在上述方法之一中 编辑: 要设置钩子,不需要类。这是一个基本的例子。其他所有问题都源于对类的使用。如果您想使用一个类,请确保您知道如何使用它。如果你不确定,C++不是java。如果一个类在没有任何限制的情况下可以完美地工作,那么就不需要使用它 例如:
#include "stdafx.h"
HHOOK hHook;
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
hHook = SetWindowsHookEx(WH_CBT, HookProcedure, hModule, 0);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
LRESULT CALLBACK HookProcedure(int nCode, WPARAM wparam, LPARAM lparam)
{
if (nCode >= 0)
{
switch (nCode)
{
case HCBT_CREATEWND:
cout << "Created!~" << endl;
break;
case HCBT_DESTROYWND:
cout << "Destroied!~" << endl;
break;
default:
cout << "sth else" << endl;
break;
}
}
else
return CallNextHookEx(hHook, nCode, wparam, lparam);
}
你是说我应该把它们都声明为静态的?在这种情况下,我现在收到链接器错误,例如!:错误LNK2001:未解析的外部符号专用:静态结构HINSTANCE\uuu*CBT::CBTHook::currentProcessHandle?currentProcessHandle@CBTHook@CBT@@0PAUHINSTANCE\uuuu@@A 1>CBTHook.obj:错误LNK2001:未解析的外部符号专用:静态结构HHOOK\uuu*CBT::CBTHook::hookID?hookID@CBTHook@CBT@@0PAUHHOOK\uu@@A需要什么传递给SetWindowsHookEx的函数不是类方法,也不是静态类方法。其他一切由你决定。如果出现错误,请发布更新的代码。我不创建类,也不创建方法,我应该如何创建dll并使用它?我按照这里的说明做了:当我试图把这个函数从我的课堂上去掉时,我不知道还能放在哪里@Hossein我编辑了答案,以包含一个使用基本windows钩子的示例。非常感谢,根据您的建议,我制作了这个dll:现在它没有任何错误,我现在如何使用这个dll?在前一种方法中,会有一个头文件,我会将它包含在我的消费者应用程序中,然后引用dll,现在怎么做?你的意思是我应该将它们全部声明为静态?在这种情况下,我现在收到链接器错误,例如!:错误LNK2001:未解析的外部符号专用:静态结构HINSTANCE\uuu*CBT::CBTHook::currentProcessHandle?currentProcessHandle@CBTHook@CBT@@0PAUHINSTANCE\uuuu@@A 1>CBTHook.obj:错误LNK2001:未解析的外部符号专用:静态结构HHOOK\uuu*CBT::CBTHook::hookID?hookID@CBTHook@CBT@@0PAUHHOOK\uu@@A需要什么传递给SetWindowsHookEx的函数不是类方法,也不是静态类方法。其他一切由你决定。如果出现错误,请发布更新的代码。我不创建类,也不创建方法,我应该如何创建dll并使用它?我按照这里的说明做了:当我试图把这个函数从我的课堂上去掉时,我不知道还能放在哪里@Hossein我编辑了答案,以包含一个使用基本windows钩子的示例。非常感谢,根据您的建议,我制作了这个dll:现在它没有任何错误,我现在如何使用这个dll?在前一种方法中,会有一个头文件,我会将它包含在我的消费者应用程序中,然后引用dll,现在怎么做?
#include "stdafx.h"
HHOOK hHook;
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
hHook = SetWindowsHookEx(WH_CBT, HookProcedure, hModule, 0);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
LRESULT CALLBACK HookProcedure(int nCode, WPARAM wparam, LPARAM lparam)
{
if (nCode >= 0)
{
switch (nCode)
{
case HCBT_CREATEWND:
cout << "Created!~" << endl;
break;
case HCBT_DESTROYWND:
cout << "Destroied!~" << endl;
break;
default:
cout << "sth else" << endl;
break;
}
}
else
return CallNextHookEx(hHook, nCode, wparam, lparam);
}