1

好吧,我尝试了不同的解决方案来解决我的问题,但它不起作用。

我调用 SetWindowsHookExA ,然后当我按下一个键时,没有显示消息框。该怎么办?

这是我的代码(这是一个由程序加载的另一个 DLL 加载的 DLL):

#include <Windows.h>

HINSTANCE gl_hThisInstance = NULL;
HHOOK hHook = NULL;

LRESULT CALLBACK KeyHit(int code,WPARAM wParam,LPARAM lParam);

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
         gl_hThisInstance = (HINSTANCE)hModule;
         hHook = SetWindowsHookExA(
            WH_KEYBOARD,
            KeyHit,
            //(HWND)gl_hThisInstance//not working
            0,//not working
            //(DWORD)gl_hThisInstance//not working
            //GetCurrentThreadId()//even not working with this
            0//not working
            );
        break;
    }
    return TRUE;
}

LRESULT CALLBACK KeyHit(int code,WPARAM wParam,LPARAM lParam)
{
    MessageBox(0,"PRESSED","PRESSED",0);
    return CallNextHookEx(hHook,code,wParam,lParam);
}
4

1 回答 1

1

我之前遇到过挂钩问题。不是真正的问题,但我这样做的方式不应该。首先,您应该有 2 个从 DLL 导出的函数,SetHook并且RemoveHook. 该SetHook函数SetWindowsHookEx()将从那里调用。如果您尝试SetWindowsHookEx()在线程或DLLMainDLL 中调用 from,该函数不会返回错误,但永远不会调用回调函数。有时我需要弄清楚。

此处发布的是我要捕获的工作代码WH_GETMESSAGE,您可以从此处参考。

这是我从 DLL 导出的 SetHook() 函数。

bool __declspec(dllexport) __stdcall SetHook(DWORD myWnd)
{
    mySavedHook = SetWindowsHookEx(WH_GETMESSAGE,
        GetMsgProc,
        infoContainer.DllHModule,
        myWnd);

    int errorID = GetLastError();
    if (errorID != 0)
    {
        MessageBoxA(NULL, "Failed to implement hook", "Failed", 0);
        MessageBoxA(NULL, to_string(errorID).c_str(), "Error ID", 0);
        return false;
    }
    else
    {
        return true;
    }
}

infoContainer.DllHModule: DLL 的实例,它是DllMain(). myWnd:是我的线程 ID(不是进程 ID)- 从GetWindowThreadProcessId(window_handle, NULL). 要实现全局挂钩,请使用 0 作为myWnd.

这是我的回调函数。

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode >= 0)
    {
        LPMSG msg = (LPMSG)lParam;
        if (msg->message == WM_CALLFUNCTION)
        {
            MessageBoxA(NULL, "Receive WM_CALLFUNTION", "Good news", 0);
        }

    }
    //Doesn't matter, just call this function and return it.
    return CallNextHookEx(_hook, nCode, wParam, lParam);
}

回调函数必须有CALLBACK关键字才能工作。

从外部应用程序中,SetHook()从 DLL 调用 并使用线程 ID 作为其参数。

于 2015-01-15T14:45:20.903 回答