gpt4 book ai didi

c++ - 为什么 SetWindowsHookEx 不接受钩子(Hook)程序?

转载 作者:行者123 更新时间:2023-11-30 01:19:42 28 4
gpt4 key购买 nike

我正在尝试创建一个 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,
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,而据我在网上阅读和看到的,相关函数的返回值是正确的.我收到错误:

error C3867: 'CBT::CBTHook::HookProcedure': function call missing argument list; use '&CBT::CBTHook::HookProcedure' to create a pointer to member

照上面的方法也不能解决问题!

我在这里错过了什么?

最佳答案

您的 Hook 过程必须是自由函数或静态类方法。如果要调用类实例方法,则需要将该调用包装在上述方法之一中。

编辑:

要设置一个钩子(Hook),你不需要类。这是一个基本的例子。其他所有问题都源于您对类(class)的使用。如果你想使用一个类,确保你知道如何去做。如果您不确定,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++ - 为什么 SetWindowsHookEx 不接受钩子(Hook)程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20565826/

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