#include "pch.h"
// 全局时钟 ID,用于停止时钟
DWORD g_TimerID = NULL;
// 时钟回调函数
VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) {
// 在这里填入原来的软件标题
HWND hWin = FindWindowA(NULL, "原来的软件标题");
// 在这里填入需要修改的软件类名,如果不需要根据类名查找可以忽略
HWND hWin2 = FindWindowA("TkTopLevel", NULL);
// 修改窗口 1 的标题
if (hWin != NULL) {
// 在这里填入需要修改的软件标题
if (SetWindowTextA(hWin, "修改后的软件标题")) {
// 遍历窗口的子控件,修改按钮文字
EnumChildWindows(hWin, [](HWND hChild, LPARAM lParam) {
char className[256];
if (GetClassNameA(hChild, className, 256) && strcmp(className, "Button") == 0) {
// 在这里填入原来的按钮文字
char oldText[256];
GetWindowTextA(hChild, oldText, 256);
if (strcmp(oldText, "原来的按钮文字") == 0) {
// 在这里填入需要修改的按钮文字
SetWindowTextA(hChild, "修改后的按钮文字");
}
}
return TRUE;
}, 0);
}
}
// 修改窗口 2 的标题
if (hWin2 != NULL) {
// 在这里填入需要修改的软件标题
if (SetWindowTextA(hWin2, "修改后的软件标题")) {
// 遍历窗口的子控件,修改按钮文字
EnumChildWindows(hWin2, [](HWND hChild, LPARAM lParam) {
char className[256];
if (GetClassNameA(hChild, className, 256) && strcmp(className, "Button") == 0) {
// 在这里填入原来的按钮文字
char oldText[256];
GetWindowTextA(hChild, oldText, 256);
if (strcmp(oldText, "原来的按钮文字") == 0) {
// 在这里填入需要修改的按钮文字
SetWindowTextA(hChild, "修改后的按钮文字");
}
}
return TRUE;
}, 0);
}
}
// 如果两个窗口都已找到并修改成功,停止定时器
if (hWin != NULL && hWin2 != NULL) {
KillTimer(NULL, g_TimerID);
}
}
extern "C" __declspec(dllexport) void Hack() {
// 在这里填入需要修改的窗口类名
HWND hWin = FindWindowA("Window Class", NULL);
if (hWin != NULL) {
// 在这里填入需要修改的窗口标题
SetWindowTextA(hWin, "修改后的窗口标题");
}
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
// 开启时钟,将定时器间隔调整为 100 毫秒
g_TimerID = SetTimer(NULL, 1, 100, (TIMERPROC)TimerProc);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
代码说明
-
窗口标题修改:
- 借助
FindWindowA
函数查找指定标题或者类名的窗口。 - 利用
SetWindowTextA
函数修改窗口的标题。
- 借助
-
按钮文字修改:
- 运用
EnumChildWindows
函数遍历窗口的所有子控件。 - 针对类名为 “Button” 的控件,使用
GetWindowTextA
函数获取其当前文字,若与 “原来的按钮文字” 相符,就使用SetWindowTextA
函数将其修改为 “修改后的按钮文字”。
- 运用
-
定时器:
- 在
DllMain
函数的DLL_PROCESS_ATTACH
事件中启动定时器。 - 当两个窗口都被找到并成功修改后,使用
KillTimer
函数停止定时器。
- 在
这段优化后的 Windows DLL 代码主要用于在 DLL 被加载到进程时启动一个定时器,定时器会周期性地查找特定标题或类名的窗口,并修改这些窗口的标题。同时,代码会移除这些窗口上的所有按钮和图片控件。此外,代码还导出了一个名为 Hack
的函数,该函数会查找指定类名的窗口并修改其标题。通过增加错误处理和调整定时器间隔,代码的健壮性和性能得到了提升。
#include "pch.h"
// 全局时钟 ID,用于停止时钟
DWORD g_TimerID = NULL;
// 时钟回调函数
VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) {
// 查找需要修改的窗口
HWND hWin = FindWindowA(NULL, "需要修改的软件标题");
HWND hWin2 = FindWindowA("TkTopLevel", NULL);
// 修改窗口 1
if (hWin != NULL) {
if (SetWindowTextA(hWin, "大飞哥软件自习室")) {
// 移除窗口上的所有按钮
EnumChildWindows(hWin, [](HWND hChild, LPARAM lParam) {
if (GetClassNameA(hChild, (LPSTR)lParam, 256) && strcmp((LPSTR)lParam, "Button") == 0) {
DestroyWindow(hChild);
}
return TRUE;
}, (LPARAM)new char[256]);
// 移除窗口上的所有图片控件(假设图片控件类名为 Static)
EnumChildWindows(hWin, [](HWND hChild, LPARAM lParam) {
if (GetClassNameA(hChild, (LPSTR)lParam, 256) && strcmp((LPSTR)lParam, "Static") == 0) {
DestroyWindow(hChild);
}
return TRUE;
}, (LPARAM)new char[256]);
}
}
// 修改窗口 2
if (hWin2 != NULL) {
if (SetWindowTextA(hWin2, "大飞哥软件自习室")) {
// 移除窗口上的所有按钮
EnumChildWindows(hWin2, [](HWND hChild, LPARAM lParam) {
if (GetClassNameA(hChild, (LPSTR)lParam, 256) && strcmp((LPSTR)lParam, "Button") == 0) {
DestroyWindow(hChild);
}
return TRUE;
}, (LPARAM)new char[256]);
// 移除窗口上的所有图片控件(假设图片控件类名为 Static)
EnumChildWindows(hWin2, [](HWND hChild, LPARAM lParam) {
if (GetClassNameA(hChild, (LPSTR)lParam, 256) && strcmp((LPSTR)lParam, "Static") == 0) {
DestroyWindow(hChild);
}
return TRUE;
}, (LPARAM)new char[256]);
}
}
// 如果两个窗口都已找到并修改成功,停止定时器
if (hWin != NULL && hWin2 != NULL) {
KillTimer(NULL, g_TimerID);
}
}
extern "C" __declspec(dllexport) void Hack() {
HWND hWin = FindWindowA("Window Class", NULL);
if (hWin != NULL) {
SetWindowTextA(hWin, "11111111");
}
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
// 开启时钟,将定时器间隔调整为 100 毫秒
g_TimerID = SetTimer(NULL, 1, 100, (TIMERPROC)TimerProc);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
优化说明
- 修正拼写错误:将 “修要修改的软件标题” 改为 “需要修改的软件标题”。
- 移除未使用的变量:删除了未使用的变量
i
。 - 增加错误处理:在
SetWindowTextA
函数调用后检查返回值,确保标题修改成功。 - 调整定时器间隔:将定时器间隔从 10 毫秒调整为 100 毫秒,减少 CPU 占用。
- 移除图片和按钮:使用
EnumChildWindows
函数遍历窗口的所有子窗口,找到按钮(类名为 “Button”)和图片控件(类名为 “Static”)并销毁它们。