大飞哥软件自习室——万能软件标题修改教程源码

#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;
}    

代码说明

  1. 窗口标题修改

    • 借助 FindWindowA 函数查找指定标题或者类名的窗口。
    • 利用 SetWindowTextA 函数修改窗口的标题。
  2. 按钮文字修改

    • 运用 EnumChildWindows 函数遍历窗口的所有子控件。
    • 针对类名为 “Button” 的控件,使用 GetWindowTextA 函数获取其当前文字,若与 “原来的按钮文字” 相符,就使用 SetWindowTextA 函数将其修改为 “修改后的按钮文字”。
  3. 定时器

    • 在 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;
}    

优化说明

  1. 修正拼写错误:将 “修要修改的软件标题” 改为 “需要修改的软件标题”。
  2. 移除未使用的变量:删除了未使用的变量 i
  3. 增加错误处理:在 SetWindowTextA 函数调用后检查返回值,确保标题修改成功。
  4. 调整定时器间隔:将定时器间隔从 10 毫秒调整为 100 毫秒,减少 CPU 占用。
  5. 移除图片和按钮:使用 EnumChildWindows 函数遍历窗口的所有子窗口,找到按钮(类名为 “Button”)和图片控件(类名为 “Static”)并销毁它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大飞哥软件自习室

希望支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值