c++ - Hook WH_CALLWNDPROC 后未获取窗口过程消息

标签 c++ windows winapi hook

我尝试使用全局 Hook ,但 Hook 过程仅收到程序线程的窗口过程消息,而针对特定应用程序(线程)则根本没有消息。

我正确地将 DLL 中的函数用于非本地 Hook 。这是我的应用程序代码。

#include <Windows.h>
#include <stdio.h>

HINSTANCE hinst;
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int main() {
    HWND notepad = FindWindow(NULL, L"Untitled - Notepad");

    if (!notepad)
        return 0;

    hinst = GetModuleHandle(NULL);

    // create a window class:
    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hinst;
    wc.lpszClassName = L"hooking";

    // register class with operating system:
    RegisterClass(&wc);

    // create and show window:
    HWND hwnd = CreateWindow(L"hooking", L"hooking", WS_OVERLAPPEDWINDOW, 0, 0, 500, 400, NULL, NULL, hinst, NULL);

    if (hwnd == NULL) {
        return 0;
    }

    ShowWindow(hwnd, SW_SHOW);

    DWORD threadID = GetWindowThreadProcessId(notepad, NULL);

    HINSTANCE hinstDLL = LoadLibrary(TEXT("..\\Debug\\ProcHookDLL.dll"));

    void (*AttachHookProc)(DWORD);
    AttachHookProc = (void (*)(DWORD)) GetProcAddress(hinstDLL, "AttachHook"); 
    AttachHookProc(threadID);

    // handle messages:
    MSG msg = {};

    while(GetMessage(&msg, hwnd, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    printf("Done execution... press any key to exit");
    char garbage = getchar();
    return 0;
}


LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    if (uMsg == WM_DESTROY) {
        PostQuitMessage(0);
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

这是 DLL 的代码。我没有收到任何消息有什么原因吗?

#include <Windows.h>
#include <stdio.h>

// TODO: create a mutex so this can only be loaded once
HMODULE thisModule;
HHOOK hook;
LRESULT CALLBACK LaunchListener(int nCode, WPARAM wParam, LPARAM lParam);

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    thisModule = hModule;

    // Very restricted set of things that can be done in DllMain, refer to documentation
    // before adding anything here.

    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

#ifdef __cplusplus    // If used by C++ code, 
extern "C" {          // we need to export the C interface
#endif
//window message loop is necessary for hooks to work? (didn't work with console app)
//provide function pointer to execute when notepad is launched.
__declspec(dllexport) void AttachHook(DWORD threadID) {
    hook = SetWindowsHookEx(WH_CALLWNDPROC, LaunchListener, thisModule, threadID);
}
#ifdef __cplusplus
}
#endif

LRESULT CALLBACK LaunchListener(int nCode, WPARAM wParam, LPARAM lParam) {
    // process event here
    if (nCode >= 0) {
        //wparam specifies if the message was sent by the current thread or not.
        CWPSTRUCT * cwp = (CWPSTRUCT *)lParam;
        wchar_t windowName[256];
        GetWindowText(cwp->hwnd, windowName, 256);
        wprintf(L"%#8X: %s\n", cwp->message, windowName);
        if (cwp->message == WM_CREATE) {
            __debugbreak();
            wchar_t moduleName[256];
            //cwp->hwnd
            //GetModuleFileName(0, moduleName, 256);
            GetWindowText(cwp->hwnd, moduleName, 256);
            int x = 0;
            x++;
        }
    }

    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

最佳答案

没有问题, Hook 安装正确。但是我不知道 Hook 过程是从其窗口过程已收到消息的进程的上下文中运行的。

关于c++ - Hook WH_CALLWNDPROC 后未获取窗口过程消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9831540/

相关文章:

C++ 标准 :vector< T* const>

c++ - 访问任何进程的内存

c++ - IDataObject 中有什么?

c++ - 如何获得我当前的剔除模式,DirectX11

c++ - doxygen 中的方程式

windows - 我可以通过 ini 文件中的设置或直接从脚本中设置 CLI 模式下 php 脚本的运行优先级吗?

windows - 创建第三方应用程序所需的虚拟化文件系统目录

c++ - Qt 不发射信号

Windows 服务 : Do work at specified times (Delphi)

c++ - 使用递归 C++ 的最小 int 数组