Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么SetWindowsHookEx不接受钩子过程?_C++_Visual C++_Hook_Setwindowshookex - Fatal编程技术网

C++ 为什么SetWindowsHookEx不接受钩子过程?

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,

我正在尝试创建一个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头文件

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);
}