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;
}
答案 0 :(得分:0)
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>
来保持每个窗口句柄与其原始过程之间的关系。