Перехват EndPaint для рисования текста в окне DirectX - PullRequest
1 голос
/ 24 августа 2011

Я хочу нарисовать текст в игре DirectX, поэтому я ввел DLL, которая перехватывает EndPaint.Моя логика заключалась в том, что, поскольку 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 Ответ

1 голос
/ 30 августа 2011

Вам лучше зацепить подарок DirectX, а затем использовать ID3DXFont для рендеринга шрифтов. AFAIK WM_PAINT не используется для визуализации DirectX.

...