DLL和绘图功能消失了

时间:2014-12-19 19:57:25

标签: c++

main.cpp(dll)http://pastebin.com/Z811YSz7 Funkcje.h http://pastebin.com/siZrUBh0 当我把这个dll注入游戏时,我不会看到字母。 当我在一段时间内绘制绘图功能时(1)然后字母出现并消失。 如何使绘图功能始终处于这个游戏的顶端。

    #include <windows.h>
#include <vector>
#include "Funkcje.h"
#include <cstdio>
#include <string>

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,
    DWORD fdwreason,
    LPVOID lpReversed)
{
    switch (fdwreason)
    {
    case DLL_PROCESS_ATTACH:
        PAINTSTRUCT ps;
        HDC hdc;
            for (size_t i = 0; i < getToplevelWindows().size(); i++){
                hdc = GetDC(getToplevelWindows()[i]);
                TextOut(hdc, 150, 150, L"TEST", 4);
                ReleaseDC(getToplevelWindows()[i], hdc);
        }
        break;
    }

    return TRUE;
}

1 个答案:

答案 0 :(得分:0)

加载DLL时,

DllMain仅被调用一次。这不是您应该放置代码的地方。

为了将代码正确地“注入”进程(通过DLL或任何其他方式),您必须首先确定您希望挂钩的进程中的哪个函数或事件。

在这种情况下,我想你想挂钩窗口事件WM_PAINT,一个来自系统的回调发送到窗口的程序,告诉它应该出于任何原因重新绘制它的内容。 (但这可能并不总是正确的,因为程序可以使用其他方法来更新窗口内容。)

所以你要做的就是找到你想要挂钩的窗口句柄,并用自己的回调程序替换它:

WNDPROC originalProc = SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)myHookProc);

但是,当然,不是在myHookProc定义并完成挂钩WM_PAINT的工作之前:

LRESULT CALLBACK myHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    LRESULT originalResult = originalProc(hWnd, uMsg, wParam, lParam); // call original first
    if (uMsg == WM_PAINT)
    {
        PAINTSTRUCT ps;
        HDC hdc = GetDC(hWnd);
        TextOut(hdc, 150, 150, L"TEST", 4);
        ReleaseDC(hWnd, hdc);
    }
    return originalResult;
}

如果您正在处理多个窗口,则可能需要使用std::unordered_map<HWND, WNDPROC>来保持每个窗口句柄与其原始过程之间的关系。