DNF_DLL/test/imguiC.cpp

416 lines
9.7 KiB
C++
Raw Normal View History

2022-09-06 00:08:26 +08:00
#include "pch.h"
#include "imguiC.h"
#include "DNFTOOL.h"
#ifdef _WIN64
#define SELF_PTR LONG_PTR
#define WNDPROC_INDEX GWLP_WNDPROC
#else
#define SELF_PTR DWORD
#define WNDPROC_INDEX GWL_WNDPROC
#endif
typedef HRESULT(WINAPI* Reset_t)(LPDIRECT3DDEVICE9, D3DPRESENT_PARAMETERS*); // 16
typedef long(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9); // 42
typedef LRESULT(__stdcall* WndProc_t)(const HWND, UINT, WPARAM, LPARAM);
D3DPRESENT_PARAMETERS g_present;
IDirect3D9* g_Direct3D9 = NULL;
IDirect3DDevice9* g_pd3dDevice = NULL;
HWND g_hWnd = NULL;
Reset_t oReset;
EndScene_t oBeginScene;
EndScene_t oEndScene;
WndProc_t oWndProc;
DWORD* dDeviceVT = NULL;
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
static bool IMGUISW = false;
LRESULT __stdcall hkWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) return true;
switch (msg) {
case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK:
case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK:
if (checkBoxFalgs_1) return true;
}
return CallWindowProc(oWndProc, hWnd, msg, wParam, lParam);
}
void MineImGuiInit(IDirect3DDevice9* pd3dDevice)
{
// <20><><EFBFBD><EFBFBD>IMGUI <20>
IMGUI_CHECKVERSION();
// <20><><EFBFBD><EFBFBD>IMGUI<55><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
// <20>ر<EFBFBD>imgui <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʾ
io.ConfigFlags = ImGuiConfigFlags_NoMouseCursorChange;
io.WantSaveIniSettings = false;
io.IniFilename = NULL;
//ImGuiStyle& style = ImGui::GetStyle();
ImGui::StyleColorsDark();
//ImGui::StyleColorsClassic();
//ImGui::StyleColorsLight();
//LoadMyStype();
//SetLayeredWindowAttributes();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>---Ϊ<><CEAA><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
ImFontConfig f_cfg;
f_cfg.FontDataOwnedByAtlas = false;
//const ImFont* font = io.Fonts->AddFontFromMemoryTTF((void*)baidu_font_data, baidu_font_size, 17.0f, &f_cfg, io.Fonts->GetGlyphRangesChineseSimplifiedCommon());
const ImFont* font = io.Fonts->AddFontFromFileTTF("Fonts/simsun.ttc", 11.5f, &f_cfg, io.Fonts->GetGlyphRangesChineseSimplifiedCommon());
ImGui_ImplWin32_Init(g_hWnd);
ImGui_ImplDX9_Init(pd3dDevice);
}
LPDIRECT3DTEXTURE9 g_texture;
void imguiC::LoadImg()
{
//unsigned char* buffer = GetNPK();
/*
for (int y = 0; y < 118; y++)
memcpy((unsigned char*)lock_rect.pBits + lock_rect.Pitch * y, buffer + (203 * 4) * y, (203 * 4));
*/
}
namespace Gdiplus
{
using std::min;
using std::max;
};
#include <atlimage.h>
bool TmainBeginSate = TRUE;
void DrawCustom(IDirect3DDevice9* pd3dDevice)
{
// <20><><EFBFBD>ʼ<E6BFAA><CABC><EFBFBD><EFBFBD>
ImGui_ImplDX9_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
// <20><><EFBFBD>ڴ<EFBFBD>С
ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_FirstUseEver);
ImGui::SetNextWindowSize(ImVec2(800, 600), ImGuiCond_FirstUseEver);
//ImGui::SetNextWindowBgAlpha(0);
ImGui::Begin(u8"imgui_Test", &TmainBeginSate, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize);
ImDrawList* draw_list = ImGui::GetForegroundDrawList();
CImage Img;
DWORD adwBitmasks[3] = { 0x0000000f, 0x000000f0, 0x00000f00 };
Img.CreateEx(100, 100, 16, BI_BITFIELDS, adwBitmasks, 0);
Img.Save(L"Test.png");
ImGui::Image(Img, ImVec2(400, 400));
draw_list->AddText(ImVec2(400, 400), 0xfaff0000,u8"<EFBFBD><EFBFBD><EFBFBD>");
/*
pd3dDevice->CreateTexture(203, 118, 1, D3DUSAGE_DYNAMIC, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &g_texture, NULL);
D3DLOCKED_RECT lock_rect;
g_texture->LockRect(0, &lock_rect, NULL, 0);
char* nPbit = (char*)lock_rect.pBits;
int nPitch = lock_rect.Pitch;
int stride = nPitch / (4 * 3);//<2F><><EFBFBD><EFBFBD>Ϊ3<CEAA>ȷݣ<C8B7>strideΪ<65><CEAA><EFBFBD><EFBFBD>
DWORD* pwd = (DWORD*)nPbit;
for (UINT row = 0; row < 240; row++)
{
for (int col = 0; col < stride; col++)
{
pwd[row * nPitch / 4 + col] = 0xFFFF0000;
pwd[row * nPitch / 4 + col + stride] = 0xFF00FF00;
pwd[row * nPitch / 4 + col + 2 * stride] = 0xFF0000FF;
}
}
g_texture->UnlockRect(0);
ImGui::Image(g_texture, ImGui::GetContentRegionAvail());
*/
//ImGui::Checkbox(u8"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ", &checkBoxFalgs_1); ImGui::SameLine();
////CString tmpste = (checkBoxFalgs_1) ? "ON" : "OFF";
////ImGui::Text(u8"[ %S ]", tmpste);
//if (ImGui::BeginTabBar("tab1", tab_bar_flags))
//{
// loadTab1();
// loadTab2();
// loadTab3();
// loadTab4();
//}
//BYTE* PNGB = GetNPK();
//ImGui::RenderText(ImVec2(203, 118), (char*)PNGB);
/*
std::vector<unsigned char> encoded;
unsigned error_enc = lodepng::encode(encoded, PNGB, 203, 118, LodePNGColorType::LCT_RGBA, unsigned(8));
static ImTextureID bg_tex_id = 0;
if (!bg_tex_id)
{
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>opencv<63><76><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC>Ȼ<EFBFBD><C8BB>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>ͼƬ
//loadTexture<72><65>һ<EFBFBD><D2BB><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪<EFBFBD><D6AA><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>аٶ<D0B0>
bg_tex_id = &encoded;
}
ImGui::Image(bg_tex_id, ImGui::GetContentRegionAvail());
*/
ImGui::EndTabBar();
ImGui::End();
ImGui::EndFrame();
ImGui::Render();
ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
}
HRESULT __stdcall hkEndScene(IDirect3DDevice9* pd3dDevice)
{
/*
static int num = 0;
std::cout << "D3d:" << num << std::endl;
++num;
*/
g_pd3dDevice = pd3dDevice;
Helpers::UnHookFunction((PVOID*)(&oEndScene), hkEndScene);
// IMGUI<55><49>ʼ<EFBFBD><CABC>
static bool firstCall = TRUE;
if (firstCall)
{
firstCall = !firstCall;
MineImGuiInit(pd3dDevice);
oWndProc = (WNDPROC)SetWindowLongPtr(g_hWnd, WNDPROC_INDEX, (LONG_PTR)hkWndProc);
}
if (IMGUISW == true)
{
//DrawCustom(pd3dDevice);
IMGUISW = false;
}
//DrawCustom();
HRESULT result = pd3dDevice->EndScene();
Helpers::HookFunction((PVOID*)(&oEndScene), hkEndScene);
return result;
}
HRESULT __stdcall hkReset(IDirect3DDevice9* pd3dDevice, D3DPRESENT_PARAMETERS* pPresentationParameters)
{
std::cout << "Im Going" << std::endl;
Helpers::UnHookFunction((PVOID*)(&oReset), &hkReset);
ImGui_ImplDX9_InvalidateDeviceObjects();
HRESULT tmpReset = pd3dDevice->Reset(pPresentationParameters);
ImGui_ImplDX9_CreateDeviceObjects();
Helpers::HookFunction((PVOID*)(&oReset), hkReset);
return tmpReset;
}
IDirect3DDevice9* imguiC::GetD3dDev9()
{
return g_pd3dDevice;
}
typedef struct tagWNDINFO
{
DWORD dwProcessId;
HWND hWnd;
} WNDINFO, * LPWNDINFO;
//ö<>ٴ<EFBFBD><D9B4>ڹ<EFBFBD><DAB9><EFBFBD>
static BOOL CALLBACK EnumProc(HWND hWnd, LPARAM lParam)
{
DWORD dwProcessId;
GetWindowThreadProcessId(hWnd, &dwProcessId);
LPWNDINFO pInfo = (LPWNDINFO)lParam;
if (dwProcessId == pInfo->dwProcessId)
{
pInfo->hWnd = hWnd;
return FALSE;
}
return TRUE;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
static HWND GetProcessMainWnd()
{
DWORD dwProcessId = ::GetCurrentProcessId();
WNDINFO wi;
wi.dwProcessId = dwProcessId;
wi.hWnd = NULL;
EnumWindows(EnumProc, (LPARAM)&wi);
return wi.hWnd;
}
void imguiC::Init()
{
IMGUISW = true;
/*
static bool Sw = false;
if (!Sw)
{
// <20><><EFBFBD><EFBFBD>IMGUI <20>
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
io.ConfigFlags = ImGuiConfigFlags_NoMouseCursorChange;
io.WantSaveIniSettings = false;
io.IniFilename = NULL;
ImGui::StyleColorsDark();
ImFontConfig f_cfg;
f_cfg.FontDataOwnedByAtlas = false;
const ImFont* font = io.Fonts->AddFontFromMemoryTTF((void*)baidu_font_data, baidu_font_size, 17.0f, &f_cfg, io.Fonts->GetGlyphRangesChineseSimplifiedCommon());
ImGui_ImplWin32_Init(g_hWnd);
ImGui_ImplDX9_Init(g_pd3dDevice);
Sw = true;
}
//g_pd3dDevice->BeginScene();
// <20><><EFBFBD>ʼ<E6BFAA><CABC><EFBFBD><EFBFBD>
ImGui_ImplDX9_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
// <20><><EFBFBD>ڴ<EFBFBD>С
ImGui::SetNextWindowPos(ImVec2(50, 50), ImGuiCond_FirstUseEver);
ImGui::SetNextWindowSize(ImVec2(350, 450), ImGuiCond_FirstUseEver);
ImGui::Begin(u8"Imgui_Test", &TmainBeginSate);
ImGui::EndTabBar();
ImGui::End();
ImGui::EndFrame();
ImGui::Render();
ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
//g_pd3dDevice->EndScene();
*/
}
void imguiC::Run()
{
//while (true)
//{
// if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 6)
// {
// std::cout << "<22><>ʼע<CABC><D7A2>" << std::endl;
// break;
// }
//}
// <20><>ȡĿ<C8A1><C4BF><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
//g_hWnd = FindWindowA("DNF Taiwan", "DNF Taiwan");
g_hWnd = GetProcessMainWnd();
//std::cout << g_hWnd << std::endl;
// <20><><EFBFBD><EFBFBD>D39<33><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
g_Direct3D9 = Direct3DCreate9(D3D_SDK_VERSION);
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9B9>
memset(&g_present, 0, sizeof(g_present));
g_present.Windowed = TRUE;
g_present.SwapEffect = D3DSWAPEFFECT_DISCARD;
g_present.BackBufferFormat = D3DFMT_UNKNOWN;
g_present.EnableAutoDepthStencil = TRUE;
g_present.AutoDepthStencilFormat = D3DFMT_D16;
// <20><><EFBFBD><EFBFBD>d3d9<64><EFBFBD><E8B1B8>ʶ
HRESULT result = g_Direct3D9->CreateDevice(
D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&g_present, &g_pd3dDevice
);
//// <20><>ʼhook<6F><6B>Ӧ<EFBFBD><D3A6>D3D9<44><39><EFBFBD><EFBFBD>
dDeviceVT = (DWORD*)*(DWORD*)g_pd3dDevice;
oReset = (Reset_t)dDeviceVT[16];
oBeginScene = (EndScene_t)dDeviceVT[41];
oEndScene = (EndScene_t)dDeviceVT[42];
Helpers::HookFunction((PVOID*)(&oReset), hkReset);
//Helpers::HookFunction((PVOID*)(&oBeginScene), hkBeginScene);
Helpers::HookFunction((PVOID*)(&oEndScene), hkEndScene);
}