为什么SetWindowsHookEx不接受钩子程序?

时间:2013-12-13 11:50:45

标签: 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,
                       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':函数调用缺少参数列表;使用'&amp; CBT :: CBTHook :: HookProcedure'创建指向成员的指针

按照上面的建议做也不能解决问题!

我在这里缺少什么?

1 个答案:

答案 0 :(得分:5)

您的钩子程序必须是自由函数或静态类方法。如果要调用类实例方法,则需要将该调用包装在上面的一个中。

编辑:

要设置挂钩,您不需要任何类。这是一个基本的例子。其他每一个问题都源于你对课程的使用。如果您想使用课程,请确保您知道如何操作。如果您不确定,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);
}