为什么 SetWindowsHookEx 不接受挂钩过程?

Why doesn't SetWindowsHookEx accept the hook procedure?

本文关键字:过程 SetWindowsHookEx 不接受 为什么      更新时间:2023-10-16

我正在尝试创建一个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);
}