Начинающий
Начинающий
- Статус
- Оффлайн
- Регистрация
- 11 Авг 2024
- Сообщения
- 36
- Реакции
- 2
У меня есть код для хука dx9. По итогу рисуется 2 меню, одно из которых нормальное, а второе просто "сливается" с задним фоном игры
Гифку залили сюды:
Помогите, кто знает как это решить???
EndScene.cpp:
hooks.cpp:
WndProc.cpp:
Гифку залили сюды:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Помогите, кто знает как это решить???
EndScene.cpp:
EndScene:
#include <pch.h>
#include <base.h>
HRESULT __stdcall Base::Hooks::EndScene(LPDIRECT3DDEVICE9 pDevice)
{
Data::pDxDevice9 = pDevice;
if (!Data::InitImGui)
{
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.ConfigFlags = ImGuiConfigFlags_NoMouseCursorChange;
ImGui_ImplWin32_Init(Data::hWindow);
ImGui_ImplDX9_Init(pDevice);
Data::InitImGui = true;
}
if (!Data::InitImGui) return Data::oEndScene(pDevice);
ImGui_ImplDX9_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
if (Data::ShowMenu)
{
ImGui::Begin("ImGui Window");
ImGui::Text("Test ImGUI Window");
if (ImGui::Button("Detach"))
Data::ToDetach = true;
ImGui::End();
}
ImGui::EndFrame();
ImGui::Render();
ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
if(Data::ToDetach)
Base::Detach();
return Data::oEndScene(pDevice);
}
hooks.cpp:
hooks:
#include <pch.h>
#include <base.h>
//Helper Functions Declarations
BOOL CALLBACK EnumWindowsCallback(HWND handle, LPARAM lParam);
HWND GetProcessWindow();
bool GetD3D9Device(void** pTable, size_t Size);
//Functions
bool Base::Hooks::Init()
{
if (GetD3D9Device((void**)Data::pDeviceTable, D3DDEV9_LEN))
{
# if defined(MEM_86)
mem::detour_t detour_method = mem::MEM_DT_M1;
# elif defined(MEM_64)
mem::detour_t detour_method = mem::MEM_DT_M0;
# endif
Data::pEndScene = Data::pDeviceTable[42];
Data::oEndScene = (EndScene_t)mem::in::detour_trampoline((mem::voidptr_t)Data::pEndScene, (mem::voidptr_t)Hooks::EndScene, Data::szEndScene);
Data::oWndProc = (WndProc_t)SetWindowLongPtr(Data::hWindow, WNDPROC_INDEX, (LONG_PTR)Hooks::WndProc);
return true;
}
return false;
}
bool Base::Hooks::Shutdown()
{
if (Data::InitImGui)
{
ImGui_ImplDX9_Shutdown();
ImGui_ImplWin32_Shutdown();
ImGui::DestroyContext();
}
mem::in::detour_restore(Data::pEndScene, (mem::byte_t*)Data::oEndScene, Data::szEndScene);
SetWindowLongPtr(Data::hWindow, WNDPROC_INDEX, (LONG_PTR)Data::oWndProc);
return true;
}
//Helper Functions Definitions
BOOL CALLBACK EnumWindowsCallback(HWND handle, LPARAM lParam)
{
DWORD wndProcId = 0;
GetWindowThreadProcessId(handle, &wndProcId);
if (GetCurrentProcessId() != wndProcId)
return TRUE;
Base::Data::hWindow = handle;
return FALSE;
}
HWND GetProcessWindow()
{
Base::Data::hWindow = (HWND)NULL;
EnumWindows(EnumWindowsCallback, NULL);
return Base::Data::hWindow;
}
bool GetD3D9Device(void** pTable, size_t Size)
{
if (!pTable)
return false;
Size [I]= sizeof(void[/I]);
IDirect3D9* pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (!pD3D)
return false;
IDirect3DDevice9* pDummyDevice = NULL;
D3DPRESENT_PARAMETERS d3dpp = {};
d3dpp.Windowed = false;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = GetProcessWindow();
HRESULT dummyDeviceCreated = pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3dpp.hDeviceWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDummyDevice);
if (dummyDeviceCreated != S_OK)
{
d3dpp.Windowed = !d3dpp.Windowed;
dummyDeviceCreated = pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3dpp.hDeviceWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDummyDevice);
if (dummyDeviceCreated != S_OK)
{
pD3D->Release();
return false;
}
}
memcpy(pTable, [I]reinterpret_cast<void**[/I]>(pDummyDevice), Size);
pDummyDevice->Release();
pD3D->Release();
return true;
}
WndProc.cpp:
WndProc:
#include <pch.h>
#include <base.h>
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK Base::Hooks::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if(uMsg == WM_KEYDOWN || uMsg == WM_KEYUP)
Data::WmKeys[wParam] = uMsg;
if (uMsg == WM_KEYDOWN)
{
switch (wParam)
{
case Data::Keys::ToggleMenu:
Data::ShowMenu = !Data::ShowMenu;
break;
case Data::Keys::DetachDll:
Data::ToDetach = true;
break;
}
}
ImGui_ImplWin32_WndProcHandler(hWnd, uMsg, wParam, lParam);
return CallWindowProc(Data::oWndProc, hWnd, uMsg, wParam, lParam);
}