Я хочу нарисовать текст в игре 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 все еще используется на базовом уровне?
Заранее спасибо.