Тема: endScene, imgui
Показать сообщение отдельно

  #1  
Старый 27.04.2024, 01:29
Lance_Sterling
Познавший АНТИЧАТ
Регистрация: 12.01.2023
Сообщений: 1,016
С нами: 1757019

Репутация: 88


По умолчанию

пытался хукнуть endScene, и у меня это получилось, сделал через дравлист отрисовку текста, и эта ***ня мерцает, и *** знает вообще что с ней происходит (без дравлиста тоже самое)

C++:





Код:
#include "includes.h"
#include 
#ifdef _WIN64
#define GWL_WNDPROC GWLP_WNDPROC
#endif
extern
LRESULT
ImGui_ImplWin32_WndProcHandler
(
HWND hWnd
,
UINT msg
,
WPARAM wParam
,
LPARAM lParam
)
;
EndScene oEndScene
=
NULL
;
WNDPROC oWndProc
;
static
HWND window
=
NULL
;
bool
menu
=
false
;
void
InitImGui
(
LPDIRECT3DDEVICE9 pDevice
)
{
ImGui
::
CreateContext
(
)
;
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
io
.
ConfigFlags
=
ImGuiConfigFlags_NoMouseCursorChange
;
io
.
ConfigFlags
|=
ImGuiConfigFlags_NavEnableKeyboard
;
io
.
ConfigFlags
|=
ImGuiConfigFlags_NavEnableGamepad
;
io
.
Fonts
->
AddFontFromFileTTF
(
"ImGui/Montserrat-SemiBold.ttf"
,
18
)
;
ImGuiStyle
&
style
=
ImGui
::
GetStyle
(
)
;
style
.
WindowRounding
=
10.0f
;
style
.
GrabRounding
=
10.0f
;
style
.
FrameRounding
=
10.0f
;
ImGui
::
StyleColorsLight
(
)
;
ImGui_ImplWin32_Init
(
window
)
;
ImGui_ImplDX9_Init
(
pDevice
)
;
}
bool
init
=
false
;
long
__stdcall
hkEndScene
(
LPDIRECT3DDEVICE9 pDevice
)
{
if
(
!
init
)
{
InitImGui
(
pDevice
)
;
init
=
true
;
}
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
(
void
)
io
;
if
(
GetAsyncKeyState
(
VK_F9
)
)
{
menu
=
!
menu
;
}
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
if
(
menu
)
{
ImDrawList
*
dl
=
ImGui
::
GetBackgroundDrawList
(
)
;
char
buffer
[
256
]
;
sprintf_s
(
buffer
,
sizeof
(
buffer
)
,
"Application average %.3f ms/frame (%.1f FPS)"
,
1000.0f
/
io
.
Framerate
,
io
.
Framerate
)
;
dl
->
AddText
(
{
100
,
100
}
,
-
1
,
buffer
)
;
}
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
return
oEndScene
(
pDevice
)
;
}
LRESULT __stdcall
WndProc
(
const
HWND hWnd
,
UINT uMsg
,
WPARAM wParam
,
LPARAM lParam
)
{
if
(
true
&&
ImGui_ImplWin32_WndProcHandler
(
hWnd
,
uMsg
,
wParam
,
lParam
)
)
return
true
;
return
CallWindowProc
(
oWndProc
,
hWnd
,
uMsg
,
wParam
,
lParam
)
;
}
BOOL CALLBACK
EnumWindowsCallback
(
HWND handle
,
LPARAM lParam
)
{
DWORD wndProcId
;
GetWindowThreadProcessId
(
handle
,
&
wndProcId
)
;
if
(
GetCurrentProcessId
(
)
!=
wndProcId
)
return
TRUE
;
// skip to next window
window
=
handle
;
return
FALSE
;
// window found abort search
}
HWND
GetProcessWindow
(
)
{
window
=
NULL
;
EnumWindows
(
EnumWindowsCallback
,
NULL
)
;
return
window
;
}
DWORD WINAPI
MainThread
(
LPVOID lpReserved
)
{
bool
attached
=
false
;
do
{
if
(
kiero
::
init
(
kiero
::
RenderType
::
D3D9
)
==
kiero
::
Status
::
Success
)
{
kiero
::
bind
(
42
,
(
void
*
*
)
&
oEndScene
,
hkEndScene
)
;
window
=
GetProcessWindow
(
)
;
oWndProc
=
(
WNDPROC
)
SetWindowLongPtr
(
window
,
GWL_WNDPROC
,
(
LONG_PTR
)
WndProc
)
;
attached
=
true
;
}
}
while
(
!
attached
)
;
return
TRUE
;
}
BOOL WINAPI
DllMain
(
HMODULE hMod
,
DWORD dwReason
,
LPVOID lpReserved
)
{
switch
(
dwReason
)
{
case
DLL_PROCESS_ATTACH
:
DisableThreadLibraryCalls
(
hMod
)
;
CreateThread
(
nullptr
,
0
,
MainThread
,
hMod
,
0
,
nullptr
)
;
break
;
case
DLL_PROCESS_DETACH
:
kiero
::
shutdown
(
)
;
break
;
}
return
TRUE
;
}


p.s. без темы, без rounding, и без шрифта тоже самое

видео:
 
Ответить с цитированием