1

我想在 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 仍在基本级别使用吗?

提前致谢。

4

1 回答 1

1

你最好钩住 DirectX 的存在,然后使用 ID3DXFont 进行一些字体渲染。AFAIK WM_PAINT 不用于 DirectX 渲染。

于 2011-08-30T18:31:17.613 回答