我想在 DirectX 游戏中绘制文本,所以我注入了一个挂钩 EndPaint 的 DLL。我的逻辑是,由于 EndPaint 应该是 WM_PAINT 操作的最后一步,我可以在我的钩子中绘制文本,然后自己调用 EndPaint。通过这样做,我完全避免了 DX 界面。
问题是它什么也没做。这是我的代码。
#include <windows.h>
#include "Hooks.h"
static const TCHAR g_cszMessage[] = TEXT("utterly fantastic");
BOOL (WINAPI * _EndPaint)(__in HWND hWnd, __in const LPPAINTSTRUCT lpPaint) = EndPaint;
BOOL WINAPI EndPaintHook(__in HWND hWnd, __in const LPPAINTSTRUCT lpPaint)
{
// write message
TextOut(lpPaint->hdc, 0, 0, g_cszMessage, lstrlen(g_cszMessage));
GdiFlush();
// return original
return _EndPaint(hWnd, lpPaint);
}
BOOL APIENTRY DllMain(__in HINSTANCE hModule, __in DWORD fdwReason, __in __reserved LPVOID lpvReserved)
{
UNREFERENCED_PARAMETER(lpvReserved);
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
if (AttachHook(reinterpret_cast<PVOID*>(&_EndPaint), EndPaintHook))
{
DisableThreadLibraryCalls(hModule);
break;
}
return FALSE;
case DLL_PROCESS_DETACH:
DetachHook(reinterpret_cast<PVOID*>(&_EndPaint), EndPaintHook);
break;
}
return TRUE;
}
我知道问题不在于我的AttachHook
/DetachHook
函数,因为我已经通过消息框进行了测试并确认已安装挂钩。文字根本没有出现。
有人知道吗?我真的不想挂钩DX接口。它不应该以任何一种方式工作,因为 WM_PAINT 仍在基本级别使用吗?
提前致谢。