为什么 SetWindowsHookEx 不接受挂钩过程?
Why doesn't SetWindowsHookEx accept the hook procedure?
我正在尝试创建一个dll,用于监视所有系统事件(进程创建、销毁等)。这就是我到目前为止提出的:
DLL主-我的DLL的入口点:
// 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头文件
//Dll header file - function signatures
#ifdef CBTHOOKDLL_EXPORTS
#define CBTHOOKDLL_API __declspec(dllexport)
#else
#define CBTHOOKDLL_API __declspec(dllimport)
#endif
namespace CBT
{
class CBTHook
{
public:
CBTHook();
static void SetHandle(HINSTANCE handle);
void InstallHook();
void UnistallHook();
LRESULT CALLBACK HookProcedure(int nCode, WPARAM wparam, LPARAM lparam);
~CBTHook();
private:
static HINSTANCE currentProcessHandle;
HOOKPROC hkprcSysMsg;
static HHOOK hookID;
};
}
CBTHook.cpp
// CBTHook.cpp : Defines the exported functions for the DLL application.
//
#pragma once
#include "stdafx.h"
#include "CBTHook.h"
#include <Windows.h>
#include <iostream>
using namespace std;
namespace CBT
{
CBTHook::CBTHook()
{
}
void CBTHook::SetHandle(HINSTANCE handle)
{
currentProcessHandle = handle;
}
void CBTHook::InstallHook()
{
hookID = SetWindowsHookEx(WH_CBT,HookProcedure, currentProcessHandle, 0);
}
void CBTHook::UnistallHook()
{
UnhookWindowsHookEx(hookID);
}
LRESULT CALLBACK CBTHook::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(hookID, nCode, wparam, lparam);
}
}
现在的问题是,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);
}
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 是否删除在对象构造过程中创建的对象
- 如何在鼠标挂钩过程中检测拖动
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- clang 插件:在编译过程中修改 AST
- 如何使变量从 x 到 y,然后从 y 返回到 x 并始终重复该过程
- 在C++中调用 MS SQL 存储过程
- 阻塞信号会导致升压过程不起作用
- Adafruit 羽毛RFM69HCW在使用过程中会冻结,需要硬重置
- 使用提升过程获取 shell 命令的标准输出
- 附加到 gdb 会中断并且不会继续该过程
- 如何创建始终在线的过程?
- 使用 Qt 测量过程的实际运行时间
- 如何在窗口过程方法中检测击键?
- 线程过程中的线程同步问题
- MySQL 连接器/C++.尝试在此过程中停止连接到数据库
- 如何在此功能中没有通信过程?
- 更改用于部署的凭据提供程序 GUID 的过程
- UWP 应用未通过认证过程
- C++ 在编译过程中 strtok 函数 Eclipse 说没有在范围内声明?