Модификация заголовка окна на имя выбранного игрока+оптимизация производительности


Основные функции:
- Подмена заголовка окна – заголовок окна меняется на имя игрока и остается таким в не зависимости фокусе окно или нет.
- Оптимизация фонового режима – предотвращает подвисания при сворачивании разворачивание игры (снижает лаги при ALT+TAB).
Как это работает?
- HookedSetText – перехватывает системный вызов изменения заголовка окна и заменяет его на имя игрока.
- OptimizeBackgroundSleep – модифицирует функцию appSleep в движке, уменьшая нагрузку в фоне.
- UpdatePlayerTitle – вызывается из скрипта игры и передает никнейм в DLL меня заголовок окна.
DLL C++:
Скомпилируйте файл и назовите его entry.dll. Поместите его в папку с игрой.
C++:
#include "pch.h"
#include <Windows.h>
#include <iostream>
// Структуры для Unreal Engine
class UObject {};
struct FFrame { int* ftable; void* Node; UObject* Object; BYTE* Code; BYTE* Locals; INT LineNum; };
// Глобальные переменные
std::wstring WindowTitle = L" ▄▀▄ BITHACK 🚀 ➤ Boosty: boosty.to/hobbycode ➤ YouTube: @bithack5612 🚀";
HWND TargetWindow = nullptr;
// Типы функций
using NativeFunction = void(__stdcall*)(FFrame&, void* const);
using RegisterNativeFn = BYTE(__cdecl*)(int, const NativeFunction&);
using SetTextFn = void(__thiscall*)(void*, const wchar_t*);
// Оригинальная функция и хук
SetTextFn OriginalSetText = nullptr;
// Поиск главного окна
HWND FindMainWindow() {
HWND window = nullptr;
EnumWindows([](HWND hwnd, LPARAM param) -> BOOL {
DWORD pid;
GetWindowThreadProcessId(hwnd, &pid);
if (pid == GetCurrentProcessId() && IsWindowVisible(hwnd)) {
*(HWND*)param = hwnd;
return FALSE;
}
return TRUE;
}, (LPARAM)&window);
return window;
}
// Обновление заголовка окна
void UpdateTitle() {
if (WindowTitle.empty() || !(TargetWindow = FindMainWindow())) return;
for (int i = 0; i < 3; i++) {
SetWindowTextW(TargetWindow, WindowTitle.c_str());
Sleep(50);
}
}
// Хук для SetText
void __fastcall HookedSetText(void* thisptr, void*, const wchar_t* text) {
TargetWindow = *(HWND*)((DWORD)thisptr + 4);
SetWindowTextW(TargetWindow, WindowTitle.c_str());
}
// Установка хука
bool InstallHook() {
HMODULE windowDll = GetModuleHandleW(L"Window.dll");
if (!windowDll) return false;
OriginalSetText = (SetTextFn)GetProcAddress(windowDll, "?SetText@WWindow@@UAEXPBG@Z");
if (!OriginalSetText) return false;
DWORD oldProtect;
VirtualProtect(OriginalSetText, 5, PAGE_EXECUTE_READWRITE, &oldProtect);
*(BYTE*)OriginalSetText = 0xE9;
*(DWORD*)((DWORD)OriginalSetText + 1) = (DWORD)HookedSetText - ((DWORD)OriginalSetText + 5);
VirtualProtect(OriginalSetText, 5, oldProtect, &oldProtect);
return true;
}
// Функция, вызываемая из игры
void __stdcall UpdatePlayerTitle(FFrame& stack, void* result) {
stack.Code++;
WindowTitle = *(const wchar_t**)result;
UpdateTitle();
CreateThread(nullptr, 0, [](LPVOID) -> DWORD {
Sleep(500);
UpdateTitle();
return 0;
}, nullptr, 0, nullptr);
}
// Оптимизация нагрузки в фоновом режиме
static float __cdecl OptimizeBackgroundSleep() {
return .1f;
}
// Регистрация функции в движке
void RegisterNative() {
if (HMODULE core = GetModuleHandleA("Core.dll")) {
if (auto registerFn = (RegisterNativeFn)GetProcAddress(core, "?GRegisterNative@@YAEHABQ8UObject@@AEXAAUFFrame@@QAX@Z@Z")) {
registerFn(2025, &UpdatePlayerTitle);
}
if (BYTE* LazyMode = (BYTE*)GetProcAddress(core, "?appSleep@@YAXM@Z")) {
DWORD oldProtect;
if (VirtualProtect(LazyMode, 5, PAGE_READWRITE, &oldProtect)) {
*LazyMode = 0xE9;
*(int*)(LazyMode + 1) = (BYTE*)OptimizeBackgroundSleep - (LazyMode + 5);
VirtualProtect(LazyMode, 5, oldProtect, &oldProtect);
}
}
}
}
// Точка входа DLL
BOOL APIENTRY DllMain(HMODULE, DWORD reason, LPVOID) {
if (reason == DLL_PROCESS_ATTACH) {
CreateThread(nullptr, 0, [](LPVOID) -> DWORD {
Sleep(1000);
InstallHook();
RegisterNative();
return 0;
}, nullptr, 0, nullptr);
}
return TRUE;
}
Взаимодействие с игрой:
Игровой скрипт вызывает нативную функцию. Этот код можно добавить в любой скрипт окна игры.
C++:
native(2025) final function string L2Title();
function PadTitleDll(string TitleExt) {
TitleExt = L2Title(); // Передает имя игрока в заголовок окна через DLL
}
// При отображении UI передает имя игрока
function OnShow()
{
local UserInfo Info;
GetPlayerInfo(Info);
PadTitleDll(Info.name); // Меняет заголовок окна на имя игрока
}
Последнее редактирование: