#include "pch.h"
// 全局时钟 ID,用于停止时钟
DWORD g_TimerID = NULL;
// 时钟回调函数
VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) {
// 查找主窗口
HWND hMainWin = FindWindowA(NULL, "需要修改的标题在此处原标题");
HWND hMainWin2 = FindWindowA("TkTopLevel", NULL);
// 修改主窗口标题
if (hMainWin != NULL) {
SetWindowTextA(hMainWin, "大飞哥软件自习室—修改后的标题");
}
if (hMainWin2 != NULL) {
SetWindowTextA(hMainWin2, "大飞哥软件自习室—修改后的标题");
}
// 枚举主窗口的子控件
if (hMainWin != NULL) {
EnumChildWindows(hMainWin, [](HWND hChild, LPARAM lParam) {
char className[256];
GetClassNameA(hChild, className, sizeof(className));
// 假设图片控件类名为 Static,按钮控件类名为 Button
if (strcmp(className, "Static") == 0) {
// 移除图片控件
DestroyWindow(hChild);
} else if (strcmp(className, "Button") == 0) {
// 修改按钮文字
SetWindowTextA(hChild, "修改后的按钮文字");
}
return TRUE;
}, 0);
}
if (hMainWin2 != NULL) {
EnumChildWindows(hMainWin2, [](HWND hChild, LPARAM lParam) {
char className[256];
GetClassNameA(hChild, className, sizeof(className));
if (strcmp(className, "Static") == 0) {
DestroyWindow(hChild);
} else if (strcmp(className, "Button") == 0) {
SetWindowTextA(hChild, "修改后的按钮文字");
}
return TRUE;
}, 0);
}
// 停止时钟
KillTimer(NULL, g_TimerID);
}
extern "C" __declspec(dllexport) void Hack() {
// 查找窗口
HWND hWin = FindWindowA("Window Class", NULL);
if (hWin != NULL) {
// 修改窗口标题
SetWindowTextA(hWin, "11111111");
// 枚举子控件
EnumChildWindows(hWin, [](HWND hChild, LPARAM lParam) {
char className[256];
GetClassNameA(hChild, className, sizeof(className));
if (strcmp(className, "Static") == 0) {
DestroyWindow(hChild);
} else if (strcmp(className, "Button") == 0) {
SetWindowTextA(hChild, "修改后的按钮文字");
}
return TRUE;
}, 0);
}
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
// 开启时钟
g_TimerID = SetTimer(NULL, 1, 10, (TIMERPROC)TimerProc);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
我将提供一个高度可配置的DLL注入模板代码。您只需要在指定位置填写需要修改的文字内容即可,无需编程基础。以下是优化后的代码结构(已标注配置区域):
#include "pch.h"
#include <Windows.h>
//■■■■■■■■■■■■配置区域(只需修改这里的内容)■■■■■■■■■■■■
// 窗口标题修改
const char* NEW_MAIN_TITLE = "大飞哥自习室-主标题"; // 主窗口标题
const char* NEW_SUB_TITLE = "VIP会员版"; // 副标题/状态栏文字
// 按钮文字修改(格式:"原始文字=新文字")
const char* BUTTON_TEXTS[][2] = {
{"登录", "会员登录"}, // 第一个按钮:原"登录"改为"会员登录"
{"注册", "立即开通"}, // 第二个按钮修改
{"设置", "高级设置"} // 继续添加更多按钮...
};
// 需要移除的图片控件特征(根据控件文字或类名识别)
const char* REMOVE_IMAGES[] = {
"广告图片", // 根据图片控件的文字标识
"Static" // 根据控件类名(如静态图片控件)
};
//■■■■■■■■■■■■配置结束■■■■■■■■■■■■
DWORD g_TimerID = NULL;
// 修改窗口属性功能模块
void ModifyWindow(HWND hWnd) {
// 修改主标题和副标题
SetWindowTextA(hWnd, NEW_MAIN_TITLE);
SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)NEW_SUB_TITLE); // 修改状态栏文字
// 遍历所有子控件
EnumChildWindows(hWnd, [](HWND hChild, LPARAM) -> BOOL {
char text[256];
GetWindowTextA(hChild, text, sizeof(text));
// 修改按钮文字
for(auto& btn : BUTTON_TEXTS) {
if(strcmp(text, btn[0]) == 0) {
SetWindowTextA(hChild, btn[1]);
break;
}
}
// 移除图片控件
char className[256];
GetClassNameA(hChild, className, sizeof(className));
for(auto& img : REMOVE_IMAGES) {
if(strcmp(text, img)==0 || strcmp(className, img)==0) {
ShowWindow(hChild, SW_HIDE); // 隐藏控件
// DestroyWindow(hChild); // 彻底销毁(慎用)
}
}
return TRUE;
}, 0);
}
// 时钟回调(自动检测窗口)
VOID CALLBACK TimerProc(HWND, UINT, DWORD, DWORD) {
if(HWND hWin = FindWindowA("目标窗口类名", NULL)) { // 填写目标窗口类名
ModifyWindow(hWin);
KillTimer(NULL, g_TimerID);
}
}
// DLL入口
BOOL APIENTRY DllMain(HMODULE, DWORD reason, LPVOID) {
if(reason == DLL_PROCESS_ATTACH) {
g_TimerID = SetTimer(NULL, 0, 1000, TimerProc); // 每秒检测一次
}
return TRUE;
}
使用说明:
实现原理:
注意事项:
建议搭配工具:
-
修改标题文字
NEW_MAIN_TITLE
:填写新的主窗口标题NEW_SUB_TITLE
:填写副标题/状态栏文字
-
修改按钮文字 在
BUTTON_TEXTS
数组中按格式添加: -
{"原始按钮文字", "要修改成的新文字"},
-
移除图片控件 在
REMOVE_IMAGES
数组中填写:- 图片控件的显示文字(如"广告位")
- 或控件类名(通常静态图片是"Static")
-
特殊配置
- 在
FindWindowA("目标窗口类名")
中填写目标程序的窗口类名(可用SPY++工具查看) - 修改检测间隔:调整
SetTimer
的第三个参数(单位毫秒)
- 在
- 窗口遍历:通过
EnumChildWindows
遍历所有子控件 - 控件识别:根据文字内容和类名识别目标控件
- 动态修改:使用
SetWindowTextA
修改文字,ShowWindow
隐藏控件 - 目标程序必须使用标准Windows控件(如Button、Static等)
- 图片控件若使用自定义类名,需要用SPY++工具获取准确信息
- 建议先使用
ShowWindow
隐藏控件,确认无误后再改用DestroyWindow
- SPY++:查看窗口/控件的类名和属性(Visual Studio自带工具)
- Cheat Engine:定位控件内存地址(可选)
- Process Explorer:验证DLL注入状态
- 定时检测:通过计时器循环检测直到目标窗口出现
万能软件标题修改2.0动态链接库DLL修改软件标题课程
- 定时检测:通过计时器循环检测直到目标窗口出现