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 に答える