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

以前はフッキングに問題がありました。実際には問題ではありませんが、私がやった方法は想定されていませんでした. まず、DLL からエクスポートされた 2 つの関数SetHookRemoveHook. SetHook関数はそこから を呼び出しますSetWindowsHookEx()SetWindowsHookEx()スレッド内またはDLLの from を呼び出そうとしてもDLLMain、関数はエラーを返しませんが、コールバック関数は呼び出されません。それを理解するのに時々かかりました。

ここに投稿されたのは、キャッチする私の作業コード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 as を使用し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 に答える