• Я зарабатываю 100 000 RUB / месяц на этом сайте!

    А знаешь как? Я всего-лишь публикую (создаю темы), а админ мне платит. Трачу деньги на мороженое, робуксы и сервера в Minecraft. А ещё на паль из Китая. 

    Хочешь так же? Пиши и узнавай условия: https://t.me/alex_redact
    Реклама: https://t.me/yougame_official

Вопрос Imgui меню слилась с задним фоном игры

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
11 Авг 2024
Сообщения
36
Реакции
2
У меня есть код для хука dx9. По итогу рисуется 2 меню, одно из которых нормальное, а второе просто "сливается" с задним фоном игры
1743078542992.png


Гифку залили сюды:
Пожалуйста, авторизуйтесь для просмотра ссылки.



Помогите, кто знает как это решить???


EndScene.cpp:

EndScene:
Expand Collapse Copy
#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:
Expand Collapse Copy
#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:
Expand Collapse Copy
#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);
}
 
С экспы менюшку спасти в чем проблема
 
Так там везде жава язык значит пойдет и терария оч на майн похожа так то у них мб даже разраб один (не уверен) так что попробуй
террария написана на шарпе, разработчики совершенно разные, в террарии dx, в а в майнкрафте opengl, это 2 абсолютно разные игры, они похожи только в плане жанра.
 
У меня есть код для хука dx9. По итогу рисуется 2 меню, одно из которых нормальное, а второе просто "сливается" с задним фоном игры
Посмотреть вложение 302273

Гифку залили сюды:
Пожалуйста, авторизуйтесь для просмотра ссылки.



Помогите, кто знает как это решить???


EndScene.cpp:

EndScene:
Expand Collapse Copy
#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:
Expand Collapse Copy
#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:
Expand Collapse Copy
#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);
}
Пофиксил самостоятельно. Решение:
Вместо EndScene хукать Present.
 
Назад
Сверху Снизу