EndPaint挂钩以将文本绘制到DirectX窗口

时间:2011-08-24 18:00:54

标签: directx hook textout

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

提前致谢。

1 个答案:

答案 0 :(得分:1)

您最好挂钩DirectX的礼物,然后使用ID3DXFont进行一些字体渲染。 AFAIK WM_PAINT不用于DirectX渲染。