china365love 发表于 4 天前

C语言开发的一款可以修改软件标题的工具导入exe程序对标题进行修改源代码实现方案

本帖最后由 china365love 于 2025-4-1 16:14 编辑

EXE 修改工具 (C++/Win32 实现)今天我将为您创建一个功能更强大的 EXE 修改工具,使用 C++ 在 Visual Studio 中实现,包含以下功能:
[*]修改 EXE 文件标题
[*]移除界面上的按钮或控件
[*]DLL 动态补丁功能
[*]拖放文件支持
完整实现步骤1. 创建 Visual Studio 项目
[*]打开 Visual Studio
[*]新建项目 -> Windows Desktop Application (Win32)
[*]命名为 "ExeModifier" 并创建
2. 主要源代码 (ExeModifier.cpp)
#include <windows.h>
#include <commctrl.h>
#include <shlobj.h>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include "resource.h"

#pragma comment(lib, "comctl32.lib")
#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

// 全局变量
HWND g_hWnd;
HWND g_hEditLog;
HWND g_hTabControl;
HWND g_hCurrentTab = NULL;

// 当前处理的文件
std::wstring g_currentFile;
std::wstring g_backupFile;

// 选项卡页面
HWND g_hTitlePage;
HWND g_hPatchPage;
HWND g_hRemovePage;

// 标题修改控件
HWND g_hOriginalTitle;
HWND g_hNewTitle;
HWND g_hBrowseExe;

// 补丁页面控件
HWND g_hDllPath;
HWND g_hBrowseDll;
HWND g_hPatchButton;

// 移除控件页面
HWND g_hClassName;
HWND g_hWindowText;
HWND g_hRemoveButton;

// 函数声明
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL InitInstance(HINSTANCE, int);
void CreateTabs();
void CreateTitlePage(HWND hTab);
void CreatePatchPage(HWND hTab);
void CreateRemovePage(HWND hTab);
void SwitchTab(int index);
void LogMessage(const std::wstring& message);
bool BackupFile(const std::wstring& filePath);
bool ModifyExeTitle(const std::wstring& filePath, const std::wstring& oldTitle, const std::wstring& newTitle);
bool PatchDllToExe(const std::wstring& exePath, const std::wstring& dllPath);
bool RemoveWindowControl(const std::wstring& exePath, const std::wstring& className, const std::wstring& windowText);
std::wstring BrowseForFile(HWND hWnd, const wchar_t* filter, bool open);

// WinMain 入口点
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // 初始化通用控件
    INITCOMMONCONTROLSEX icex;
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icex.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&icex);

    // 注册窗口类
    WNDCLASSEXW wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra   = 0;
    wcex.cbWndExtra   = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
    wcex.hCursor      = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName= L"ExeModifierClass";
    wcex.hIconSm      = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_ICON1));

    if (!RegisterClassExW(&wcex))
    {
      return FALSE;
    }

    // 创建主窗口
    if (!InitInstance(hInstance, nCmdShow))
    {
      return FALSE;
    }

    // 主消息循环
    MSG msg;
    while (GetMessage(&msg, nullptr, 0, 0))
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }

    return (int) msg.wParam;
}

// 初始化实例
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   g_hWnd = CreateWindowW(L"ExeModifierClass", L"EXE修改工具 - 大飞哥软件自习室", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
      CW_USEDEFAULT, 0, 800, 600, nullptr, nullptr, hInstance, nullptr);

   if (!g_hWnd)
   {
      return FALSE;
   }

   // 创建日志编辑框
   g_hEditLog = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"",
       WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY,
       10, 350, 760, 200, g_hWnd, NULL, hInstance, NULL);

   // 设置字体
   HFONT hFont = CreateFont(14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
       OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Microsoft YaHei");
   SendMessage(g_hEditLog, WM_SETFONT, (WPARAM)hFont, TRUE);

   // 创建选项卡
   CreateTabs();

   // 启用拖放
   DragAcceptFiles(g_hWnd, TRUE);

   ShowWindow(g_hWnd, nCmdShow);
   UpdateWindow(g_hWnd);

   // 初始显示第一个选项卡
   SwitchTab(0);

   return TRUE;
}

// 创建选项卡控件
void CreateTabs()
{
    HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(g_hWnd, GWLP_HINSTANCE);

    // 创建选项卡控件
    g_hTabControl = CreateWindow(WC_TABCONTROL, L"", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS,
      10, 10, 760, 330, g_hWnd, NULL, hInstance, NULL);

    // 添加选项卡
    TCITEM tie;
    tie.mask = TCIF_TEXT;

    tie.pszText = L"修改标题";
    TabCtrl_InsertItem(g_hTabControl, 0, &tie);

    tie.pszText = L"DLL补丁";
    TabCtrl_InsertItem(g_hTabControl, 1, &tie);

    tie.pszText = L"移除控件";
    TabCtrl_InsertItem(g_hTabControl, 2, &tie);

    // 创建各个选项卡页面
    CreateTitlePage(g_hTabControl);
    CreatePatchPage(g_hTabControl);
    CreateRemovePage(g_hTabControl);
}

// 创建标题修改页面
void CreateTitlePage(HWND hTab)
{
    HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(g_hWnd, GWLP_HINSTANCE);

    // 创建页面容器
    g_hTitlePage = CreateWindow(L"STATIC", L"", WS_CHILD | WS_VISIBLE | WS_GROUP,
      20, 40, 740, 290, hTab, NULL, hInstance, NULL);

    // 创建控件
    CreateWindow(L"STATIC", L"EXE文件:", WS_CHILD | WS_VISIBLE,
      20, 20, 100, 20, g_hTitlePage, NULL, hInstance, NULL);

    HWND hEditExe = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"",
      WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
      120, 20, 500, 20, g_hTitlePage, NULL, hInstance, NULL);
    g_hBrowseExe = CreateWindow(L"BUTTON", L"浏览...", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
      630, 20, 80, 20, g_hTitlePage, (HMENU)IDC_BROWSE_EXE, hInstance, NULL);

    CreateWindow(L"STATIC", L"原标题:", WS_CHILD | WS_VISIBLE,
      20, 60, 100, 20, g_hTitlePage, NULL, hInstance, NULL);
    g_hOriginalTitle = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"",
      WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
      120, 60, 500, 20, g_hTitlePage, NULL, hInstance, NULL);

    CreateWindow(L"STATIC", L"新标题:", WS_CHILD | WS_VISIBLE,
      20, 100, 100, 20, g_hTitlePage, NULL, hInstance, NULL);
    g_hNewTitle = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"",
      WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
      120, 100, 500, 20, g_hTitlePage, NULL, hInstance, NULL);

    CreateWindow(L"BUTTON", L"修改标题", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
      300, 140, 120, 30, g_hTitlePage, (HMENU)IDC_MODIFY_TITLE, hInstance, NULL);

    // 设置字体
    HFONT hFont = CreateFont(14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
      OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Microsoft YaHei");
   
    SendMessage(hEditExe, WM_SETFONT, (WPARAM)hFont, TRUE);
    SendMessage(g_hOriginalTitle, WM_SETFONT, (WPARAM)hFont, TRUE);
    SendMessage(g_hNewTitle, WM_SETFONT, (WPARAM)hFont, TRUE);
    SendMessage(g_hBrowseExe, WM_SETFONT, (WPARAM)hFont, TRUE);
}

// 创建补丁页面
void CreatePatchPage(HWND hTab)
{
    HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(g_hWnd, GWLP_HINSTANCE);

    // 创建页面容器
    g_hPatchPage = CreateWindow(L"STATIC", L"", WS_CHILD | WS_VISIBLE | WS_GROUP,
      20, 40, 740, 290, hTab, NULL, hInstance, NULL);
    ShowWindow(g_hPatchPage, SW_HIDE);

    // 创建控件
    CreateWindow(L"STATIC", L"EXE文件:", WS_CHILD | WS_VISIBLE,
      20, 20, 100, 20, g_hPatchPage, NULL, hInstance, NULL);

    HWND hEditExe = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"",
      WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
      120, 20, 500, 20, g_hPatchPage, NULL, hInstance, NULL);
    CreateWindow(L"BUTTON", L"浏览...", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
      630, 20, 80, 20, g_hPatchPage, (HMENU)IDC_BROWSE_EXE_PATCH, hInstance, NULL);

    CreateWindow(L"STATIC", L"DLL文件:", WS_CHILD | WS_VISIBLE,
      20, 60, 100, 20, g_hPatchPage, NULL, hInstance, NULL);
    g_hDllPath = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"",
      WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
      120, 60, 500, 20, g_hPatchPage, NULL, hInstance, NULL);
    g_hBrowseDll = CreateWindow(L"BUTTON", L"浏览...", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
      630, 60, 80, 20, g_hPatchPage, (HMENU)IDC_BROWSE_DLL, hInstance, NULL);

    g_hPatchButton = CreateWindow(L"BUTTON", L"打补丁", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
      300, 100, 120, 30, g_hPatchPage, (HMENU)IDC_PATCH_EXE, hInstance, NULL);

    // 设置字体
    HFONT hFont = CreateFont(14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
      OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Microsoft YaHei");
   
    SendMessage(hEditExe, WM_SETFONT, (WPARAM)hFont, TRUE);
    SendMessage(g_hDllPath, WM_SETFONT, (WPARAM)hFont, TRUE);
    SendMessage(g_hBrowseDll, WM_SETFONT, (WPARAM)hFont, TRUE);
    SendMessage(g_hPatchButton, WM_SETFONT, (WPARAM)hFont, TRUE);
}

// 创建移除控件页面
void CreateRemovePage(HWND hTab)
{
    HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(g_hWnd, GWLP_HINSTANCE);

    // 创建页面容器
    g_hRemovePage = CreateWindow(L"STATIC", L"", WS_CHILD | WS_VISIBLE | WS_GROUP,
      20, 40, 740, 290, hTab, NULL, hInstance, NULL);
    ShowWindow(g_hRemovePage, SW_HIDE);

    // 创建控件
    CreateWindow(L"STATIC", L"EXE文件:", WS_CHILD | WS_VISIBLE,
      20, 20, 100, 20, g_hRemovePage, NULL, hInstance, NULL);

    HWND hEditExe = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"",
      WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
      120, 20, 500, 20, g_hRemovePage, NULL, hInstance, NULL);
    CreateWindow(L"BUTTON", L"浏览...", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
      630, 20, 80, 20, g_hRemovePage, (HMENU)IDC_BROWSE_EXE_REMOVE, hInstance, NULL);

    CreateWindow(L"STATIC", L"类名:", WS_CHILD | WS_VISIBLE,
      20, 60, 100, 20, g_hRemovePage, NULL, hInstance, NULL);
    g_hClassName = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"",
      WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
      120, 60, 500, 20, g_hRemovePage, NULL, hInstance, NULL);

    CreateWindow(L"STATIC", L"窗口文本:", WS_CHILD | WS_VISIBLE,
      20, 100, 100, 20, g_hRemovePage, NULL, hInstance, NULL);
    g_hWindowText = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"",
      WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
      120, 100, 500, 20, g_hRemovePage, NULL, hInstance, NULL);

    g_hRemoveButton = CreateWindow(L"BUTTON", L"移除控件", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
      300, 140, 120, 30, g_hRemovePage, (HMENU)IDC_REMOVE_CONTROL, hInstance, NULL);

    // 设置字体
    HFONT hFont = CreateFont(14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
      OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Microsoft YaHei");
   
    SendMessage(hEditExe, WM_SETFONT, (WPARAM)hFont, TRUE);
    SendMessage(g_hClassName, WM_SETFONT, (WPARAM)hFont, TRUE);
    SendMessage(g_hWindowText, WM_SETFONT, (WPARAM)hFont, TRUE);
    SendMessage(g_hRemoveButton, WM_SETFONT, (WPARAM)hFont, TRUE);
}

// 切换选项卡
void SwitchTab(int index)
{
    // 隐藏当前选项卡
    if (g_hCurrentTab)
    {
      ShowWindow(g_hCurrentTab, SW_HIDE);
    }

    // 显示选中的选项卡
    switch (index)
    {
    case 0:
      g_hCurrentTab = g_hTitlePage;
      break;
    case 1:
      g_hCurrentTab = g_hPatchPage;
      break;
    case 2:
      g_hCurrentTab = g_hRemovePage;
      break;
    }

    ShowWindow(g_hCurrentTab, SW_SHOW);
}

// 窗口过程
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
      {
            int wmId = LOWORD(wParam);
            // 处理菜单选择
            switch (wmId)
            {
            case IDC_BROWSE_EXE:
            case IDC_BROWSE_EXE_PATCH:
            case IDC_BROWSE_EXE_REMOVE:
                {
                  std::wstring filePath = BrowseForFile(hWnd, L"可执行文件 (*.exe)\0*.exe\0所有文件 (*.*)\0*.*\0", true);
                  if (!filePath.empty())
                  {
                        g_currentFile = filePath;
                        HWND hEdit = NULL;
                        
                        if (wmId == IDC_BROWSE_EXE)
                            hEdit = GetWindow(g_hOriginalTitle, GW_HWNDPREV);
                        else if (wmId == IDC_BROWSE_EXE_PATCH)
                            hEdit = GetWindow(g_hDllPath, GW_HWNDPREV);
                        else if (wmId == IDC_BROWSE_EXE_REMOVE)
                            hEdit = GetWindow(g_hClassName, GW_HWNDPREV);
                        
                        if (hEdit)
                            SetWindowText(hEdit, filePath.c_str());
                        
                        LogMessage(L"已选择文件: " + filePath);
                  }
                }
                break;
               
            case IDC_BROWSE_DLL:
                {
                  std::wstring filePath = BrowseForFile(hWnd, L"动态链接库 (*.dll)\0*.dll\0所有文件 (*.*)\0*.*\0", true);
                  if (!filePath.empty())
                  {
                        SetWindowText(g_hDllPath, filePath.c_str());
                        LogMessage(L"已选择DLL文件: " + filePath);
                  }
                }
                break;
               
            case IDC_MODIFY_TITLE:
                {
                  wchar_t originalTitle = {0};
                  wchar_t newTitle = {0};
                  
                  GetWindowText(g_hOriginalTitle, originalTitle, 256);
                  GetWindowText(g_hNewTitle, newTitle, 256);
                  
                  if (g_currentFile.empty())
                  {
                        MessageBox(hWnd, L"请先选择EXE文件", L"错误", MB_ICONERROR);
                        break;
                  }
                  
                  if (wcslen(originalTitle) == 0)
                  {
                        MessageBox(hWnd, L"请输入原标题", L"错误", MB_ICONERROR);
                        break;
                  }
                  
                  if (wcslen(newTitle) == 0)
                  {
                        MessageBox(hWnd, L"请输入新标题", L"错误", MB_ICONERROR);
                        break;
                  }
                  
                  if (BackupFile(g_currentFile))
                  {
                        if (ModifyExeTitle(g_currentFile, originalTitle, newTitle))
                        {
                            LogMessage(L"标题修改成功!");
                            MessageBox(hWnd, L"标题修改成功!", L"成功", MB_ICONINFORMATION);
                        }
                        else
                        {
                            LogMessage(L"标题修改失败!");
                        }
                  }
                }
                break;
               
            case IDC_PATCH_EXE:
                {
                  if (g_currentFile.empty())
                  {
                        MessageBox(hWnd, L"请先选择EXE文件", L"错误", MB_ICONERROR);
                        break;
                  }
                  
                  wchar_t dllPath = {0};
                  GetWindowText(g_hDllPath, dllPath, MAX_PATH);
                  
                  if (wcslen(dllPath) == 0)
                  {
                        MessageBox(hWnd, L"请选择要注入的DLL文件", L"错误", MB_ICONERROR);
                        break;
                  }
                  
                  if (BackupFile(g_currentFile))
                  {
                        if (PatchDllToExe(g_currentFile, dllPath))
                        {
                            LogMessage(L"DLL注入成功!");
                            MessageBox(hWnd, L"DLL注入成功!", L"成功", MB_ICONINFORMATION);
                        }
                        else
                        {
                            LogMessage(L"DLL注入失败!");
                        }
                  }
                }
                break;
               
            case IDC_REMOVE_CONTROL:
                {
                  if (g_currentFile.empty())
                  {
                        MessageBox(hWnd, L"请先选择EXE文件", L"错误", MB_ICONERROR);
                        break;
                  }
                  
                  wchar_t className = {0};
                  wchar_t windowText = {0};
                  
                  GetWindowText(g_hClassName, className, 256);
                  GetWindowText(g_hWindowText, windowText, 256);
                  
                  if (wcslen(className) == 0 && wcslen(windowText) == 0)
                  {
                        MessageBox(hWnd, L"请输入类名或窗口文本", L"错误", MB_ICONERROR);
                        break;
                  }
                  
                  if (BackupFile(g_currentFile))
                  {
                        if (RemoveWindowControl(g_currentFile, className, windowText))
                        {
                            LogMessage(L"控件移除成功!");
                            MessageBox(hWnd, L"控件移除成功!", L"成功", MB_ICONINFORMATION);
                        }
                        else
                        {
                            LogMessage(L"控件移除失败!");
                        }
                  }
                }
                break;
               
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
      }
      break;
      
    case WM_NOTIFY:
      {
            LPNMHDR lpnmhdr = (LPNMHDR)lParam;
            if (lpnmhdr->hwndFrom == g_hTabControl && lpnmhdr->code == TCN_SELCHANGE)
            {
                int selectedTab = TabCtrl_GetCurSel(g_hTabControl);
                SwitchTab(selectedTab);
            }
      }
      break;
      
    case WM_DROPFILES:
      {
            HDROP hDrop = (HDROP)wParam;
            wchar_t filePath = {0};
            
            // 获取拖放的文件路径
            DragQueryFile(hDrop, 0, filePath, MAX_PATH);
            DragFinish(hDrop);
            
            // 检查文件扩展名
            std::wstring ext = filePath;
            size_t dotPos = ext.find_last_of(L".");
            if (dotPos != std::wstring::npos)
            {
                ext = ext.substr(dotPos);
                std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
               
                if (ext == L".exe")
                {
                  g_currentFile = filePath;
                  
                  // 根据当前选项卡设置对应的编辑框
                  HWND hEdit = NULL;
                  if (g_hCurrentTab == g_hTitlePage)
                        hEdit = GetWindow(g_hOriginalTitle, GW_HWNDPREV);
                  else if (g_hCurrentTab == g_hPatchPage)
                        hEdit = GetWindow(g_hDllPath, GW_HWNDPREV);
                  else if (g_hCurrentTab == g_hRemovePage)
                        hEdit = GetWindow(g_hClassName, GW_HWNDPREV);
                  
                  if (hEdit)
                        SetWindowText(hEdit, filePath.c_str());
                  
                  LogMessage(L"已拖放文件: " + g_currentFile);
                }
                else if (ext == L".dll" && g_hCurrentTab == g_hPatchPage)
                {
                  SetWindowText(g_hDllPath, filePath.c_str());
                  LogMessage(L"已拖放DLL文件: " + std::wstring(filePath));
                }
            }
      }
      break;
      
    case WM_CLOSE:
      DestroyWindow(hWnd);
      break;
      
    case WM_DESTROY:
      PostQuitMessage(0);
      break;
      
    default:
      return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// 记录日志
void LogMessage(const std::wstring& message)
{
    SYSTEMTIME st;
    GetLocalTime(&st);
   
    std::wstringstream ss;
    ss << std::setw(2) << std::setfill(L'0') << st.wHour << L":"
       << std::setw(2) << std::setfill(L'0') << st.wMinute << L":"
       << std::setw(2) << std::setfill(L'0') << st.wSecond << L" - "
       << message << L"\r\n";
   
    SendMessage(g_hEditLog, EM_SETSEL, (WPARAM)-1, (LPARAM)-1);
    SendMessage(g_hEditLog, EM_REPLACESEL, 0, (LPARAM)ss.str().c_str());
}

// 浏览文件
std::wstring BrowseForFile(HWND hWnd, const wchar_t* filter, bool open)
{
    OPENFILENAME ofn;
    wchar_t filePath = {0};
   
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hWnd;
    ofn.lpstrFile = filePath;
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrFilter = filter;
    ofn.nFilterIndex = 1;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
   
    if (open)
    {
      if (GetOpenFileName(&ofn))
            return filePath;
    }
    else
    {
      if (GetSaveFileName(&ofn))
            return filePath;
    }
   
    return L"";
}

// 创建备份文件
bool BackupFile(const std::wstring& filePath)
{
    std::wstring backupDir = filePath.substr(0, filePath.find_last_of(L'\\')) + L"\\backup";
    CreateDirectory(backupDir.c_str(), NULL);
   
    std::wstring fileName = filePath.substr(filePath.find_last_of(L'\\') + 1);
    g_backupFile = backupDir + L"\\original_" + fileName;
   
    if (CopyFile(filePath.c_str(), g_backupFile.c_str(), FALSE))
    {
      LogMessage(L"已创建备份: " + g_backupFile);
      return true;
    }
    else
    {
      LogMessage(L"创建备份失败!");
      return false;
    }
}

// 修改EXE标题
bool ModifyExeTitle(const std::wstring& filePath, const std::wstring& oldTitle, const std::wstring& newTitle)
{
    LogMessage(L"开始修改标题...");
   
    std::ifstream file(filePath, std::ios::binary | std::ios::ate);
    if (!file.is_open())
    {
      LogMessage(L"无法打开文件: " + filePath);
      return false;
    }
   
    std::streamsize size = file.tellg();
    file.seekg(0, std::ios::beg);
   
    std::vector<char> buffer(size);
    if (!file.read(buffer.data(), size))
    {
      LogMessage(L"读取文件失败!");
      return false;
    }
   
    file.close();
   
    // 转换字符串为多字节格式
    int oldTitleSize = WideCharToMultiByte(CP_ACP, 0, oldTitle.c_str(), -1, NULL, 0, NULL, NULL);
    std::vector<char> oldTitleMb(oldTitleSize);
    WideCharToMultiByte(CP_ACP, 0, oldTitle.c_str(), -1, oldTitleMb.data(), oldTitleSize, NULL, NULL);
   
    int newTitleSize = WideCharToMultiByte(CP_ACP, 0, newTitle.c_str(), -1, NULL, 0, NULL, NULL);
    std::vector<char> newTitleMb(newTitleSize);
    WideCharToMultiByte(CP_ACP, 0, newTitle.c_str(), -1, newTitleMb.data(), newTitleSize, NULL, NULL);
   
    // 查找并替换标题
    char* p = buffer.data();
    char* end = p + size - oldTitleMb.size() + 1;
    bool found = false;
   
    for (; p < end; ++p)
    {
      if (memcmp(p, oldTitleMb.data(), oldTitleMb.size() - 1) == 0)
      {
            found = true;
            memcpy(p, newTitleMb.data(), newTitleMb.size() - 1);
            LogMessage(L"找到并替换标题!");
            break;
      }
    }
   
    if (!found)
    {
      LogMessage(L"未找到匹配的标题!");
      return false;
    }
   
    // 写回文件
    std::ofstream outFile(filePath, std::ios::binary | std::ios::trunc);
    if (!outFile.write(buffer.data(), size))
    {
      LogMessage(L"写入文件失败!");
      return false;
    }
   
    outFile.close();
    return true;
}

// DLL注入
bool PatchDllToExe(const std::wstring& exePath, const std::wstring& dllPath)
{
    LogMessage(L"开始DLL注入...");
   
    // 1. 检查DLL文件是否存在
    if (GetFileAttributes(dllPath.c_str()) == INVALID_FILE_ATTRIBUTES)
    {
      LogMessage(L"DLL文件不存在: " + dllPath);
      return false;
    }
   
    // 2. 获取DLL文件名(仅文件名,不含路径)
    std::wstring dllName = dllPath.substr(dllPath.find_last_of(L'\\') + 1);
   
    // 3. 读取EXE文件
    std::ifstream exeFile(exePath, std::ios::binary | std::ios::ate);
    if (!exeFile.is_open())
    {
      LogMessage(L"无法打开EXE文件: " + exePath);
      return false;
    }
   
    std::streamsize size = exeFile.tellg();
    exeFile.seekg(0, std::ios::beg);
   
    std::vector<char> buffer(size);
    if (!exeFile.read(buffer.data(), size))
    {
      LogMessage(L"读取EXE文件失败!");
      return false;
    }
   
    exeFile.close();
   
    // 4. 查找PE文件中的导入表
    PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)buffer.data();
    if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE)
    {
      LogMessage(L"无效的DOS头!");
      return false;
    }
   
    PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)(buffer.data() + dosHeader->e_lfanew);
    if (ntHeaders->Signature != IMAGE_NT_SIGNATURE)
    {
      LogMessage(L"无效的NT头!");
      return false;
    }
   
    // 5. 查找或创建导入表
    // 这里简化处理,实际实现需要更复杂的PE文件操作
    // 在实际应用中,建议使用专业的PE解析库
   
    LogMessage(L"DLL注入功能需要更复杂的PE文件操作实现");
    LogMessage(L"当前版本仅演示功能,实际注入需要完整实现");
   
    return false;
}

// 移除窗口控件
bool RemoveWindowControl(const std::wstring& exePath, const std::wstring& className, const std::wstring& windowText)
{
    LogMessage(L"开始移除控件...");
    LogMessage(L"类名: " + className);
    LogMessage(L"窗口文本: " + windowText);
   
    // 在实际应用中,这需要修改EXE的资源段或代码段
    // 这里简化处理,实际实现需要更复杂的PE文件操作
   
    LogMessage(L"控件移除功能需要更复杂的PE文件操作实现");
    LogMessage(L"当前版本仅演示功能,实际移除需要完整实现");
   
    return false;
}
// 窗口过程LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    switch (message)    {    case WM_COMMAND:      {            int wmId = LOWORD(wParam);            // 处理菜单选择            switch (wmId)            {            case IDC_BROWSE_EXE:            case IDC_BROWSE_EXE_PATCH:            case IDC_BROWSE_EXE_REMOVE:                {                  std::wstring filePath = BrowseForFile(hWnd, L"可执行文件 (*.exe)\0*.exe\0所有文件 (*.*)\0*.*\0", true);                  if (!filePath.empty())                  {                        g_currentFile = filePath;                        HWND hEdit = NULL;                                                if (wmId == IDC_BROWSE_EXE)                            hEdit = GetWindow(g_hOriginalTitle, GW_HWNDPREV);                        else if (wmId == IDC_BROWSE_EXE_PATCH)                            hEdit = GetWindow(g_hDllPath, GW_HWNDPREV);                        else if (wmId == IDC_BROWSE_EXE_REMOVE)                            hEdit = GetWindow(g_hClassName, GW_HWNDPREV);                                                if (hEdit)                            SetWindowText(hEdit, filePath.c_str());                                                LogMessage(L"已选择文件: " + filePath);                  }                }                break;                            case IDC_BROWSE_DLL:                {                  std::wstring filePath = BrowseForFile(hWnd, L"动态链接库 (*.dll)\0*.dll\0所有文件 (*.*)\0*.*\0", true);                  if (!filePath.empty())                  {                        SetWindowText(g_hDllPath, filePath.c_str());                        LogMessage(L"已选择DLL文件: " + filePath);                  }                }                break;                            case IDC_MODIFY_TITLE:                {                  wchar_t originalTitle[256] = {0};                  wchar_t newTitle[256] = {0};                                    GetWindowText(g_hOriginalTitle, originalTitle, 256);                  GetWindowText(g_hNewTitle, newTitle, 256);                                    if (g_currentFile.empty())                  {                        MessageBox(hWnd, L"请先选择EXE文件", L"错误", MB_ICONERROR);                        break;                  }                                    if (wcslen(originalTitle) == 0)                  {                        MessageBox(hWnd, L"请输入原标题", L"错误", MB_ICONERROR);                        break;                  }                                    if (wcslen(newTitle) == 0)                  {                        MessageBox(hWnd, L"请输入新标题", L"错误", MB_ICONERROR);                        break;                  }                                    if (BackupFile(g_currentFile))                  {                        if (ModifyExeTitle(g_currentFile, originalTitle, newTitle))                        {                            LogMessage(L"标题修改成功!");                            MessageBox(hWnd, L"标题修改成功!", L"成功", MB_ICONINFORMATION);                        }                        else                        {                            LogMessage(L"标题修改失败!");                        }                  }                }                break;                            case IDC_PATCH_EXE:                {                  if (g_currentFile.empty())                  {                        MessageBox(hWnd, L"请先选择EXE文件", L"错误", MB_ICONERROR);                        break;                  }                                    wchar_t dllPath = {0};                  GetWindowText(g_hDllPath, dllPath, MAX_PATH);                                    if (wcslen(dllPath) == 0)                  {                        MessageBox(hWnd, L"请选择要注入的DLL文件", L"错误", MB_ICONERROR);                        break;                  }                                    if (BackupFile(g_currentFile))                  {                        if (PatchDllToExe(g_currentFile, dllPath))                        {                            LogMessage(L"DLL注入成功!");                            MessageBox(hWnd, L"DLL注入成功!", L"成功", MB_ICONINFORMATION);                        }                        else                        {                            LogMessage(L"DLL注入失败!");                        }                  }                }                break;                            case IDC_REMOVE_CONTROL:                {                  if (g_currentFile.empty())                  {                        MessageBox(hWnd, L"请先选择EXE文件", L"错误", MB_ICONERROR);                        break;                  }                                    wchar_t className[256] = {0};                  wchar_t windowText[256] = {0};                                    GetWindowText(g_hClassName, className, 256);                  GetWindowText(g_hWindowText, windowText, 256);                                    if (wcslen(className) == 0 && wcslen(windowText) == 0)                  {                        MessageBox(hWnd, L"请输入类名或窗口文本", L"错误", MB_ICONERROR);                        break;                  }                                    if (BackupFile(g_currentFile))                  {                        if (RemoveWindowControl(g_currentFile, className, windowText))                        {                            LogMessage(L"控件移除成功!");                            MessageBox(hWnd, L"控件移除成功!", L"成功", MB_ICONINFORMATION);                        }                        else                        {                            LogMessage(L"控件移除失败!");                        }                  }                }                break;                            default:                return DefWindowProc(hWnd, message, wParam, lParam);            }      }      break;          case WM_NOTIFY:      {            LPNMHDR lpnmhdr = (LPNMHDR)lParam;            if (lpnmhdr->hwndFrom == g_hTabControl && lpnmhdr->code == TCN_SELCHANGE)            {                int selectedTab = TabCtrl_GetCurSel(g_hTabControl);                SwitchTab(selectedTab);            }      }      break;          case WM_DROPFILES:      {            HDROP hDrop = (HDROP)wParam;            wchar_t filePath = {0};                        // 获取拖放的文件路径            DragQueryFile(hDrop, 0, filePath, MAX_PATH);            DragFinish(hDrop);                        // 检查文件扩展名            std::wstring ext = filePath;            size_t dotPos = ext.find_last_of(L".");            if (dotPos != std::wstring::npos)            {                ext = ext.substr(dotPos);                std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);                                if (ext == L".exe")                {                  g_currentFile = filePath;                                    // 根据当前选项卡设置对应的编辑框                  HWND hEdit = NULL;                  if (g_hCurrentTab == g_hTitlePage)                        hEdit = GetWindow(g_hOriginalTitle, GW_HWNDPREV);                  else if (g_hCurrentTab == g_hPatchPage)                        hEdit = GetWindow(g_hDllPath, GW_HWNDPREV);                  else if (g_hCurrentTab == g_hRemovePage)                        hEdit = GetWindow(g_hClassName, GW_HWNDPREV);                                    if (hEdit)                        SetWindowText(hEdit, filePath.c_str());                                    LogMessage(L"已拖放文件: " + g_currentFile);                }                else if (ext == L".dll" && g_hCurrentTab == g_hPatchPage)                {                  SetWindowText(g_hDllPath, filePath.c_str());                  LogMessage(L"已拖放DLL文件: " + std::wstring(filePath));                }            }      }      break;          case WM_CLOSE:      DestroyWindow(hWnd);      break;          case WM_DESTROY:      PostQuitMessage(0);      break;          default:      return DefWindowProc(hWnd, message, wParam, lParam);    }    return 0;}// 记录日志void LogMessage(const std::wstring& message){    SYSTEMTIME st;    GetLocalTime(&st);        std::wstringstream ss;    ss << std::setw(2) << std::setfill(L'0') << st.wHour << L":"       << std::setw(2) << std::setfill(L'0') << st.wMinute << L":"       << std::setw(2) << std::setfill(L'0') << st.wSecond << L" - "       << message << L"\r\n";        SendMessage(g_hEditLog, EM_SETSEL, (WPARAM)-1, (LPARAM)-1);    SendMessage(g_hEditLog, EM_REPLACESEL, 0, (LPARAM)ss.str().c_str());}// 浏览文件std::wstring BrowseForFile(HWND hWnd, const wchar_t* filter, bool open){    OPENFILENAME ofn;    wchar_t filePath = {0};        ZeroMemory(&ofn, sizeof(ofn));    ofn.lStructSize = sizeof(ofn);    ofn.hwndOwner = hWnd;    ofn.lpstrFile = filePath;    ofn.nMaxFile = MAX_PATH;    ofn.lpstrFilter = filter;    ofn.nFilterIndex = 1;    ofn.lpstrInitialDir = NULL;    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;        if (open)    {      if (GetOpenFileName(&ofn))            return filePath;    }    else    {      if (GetSaveFileName(&ofn))            return filePath;    }        return L"";}// 创建备份文件bool BackupFile(const std::wstring& filePath){    std::wstring backupDir = filePath.substr(0, filePath.find_last_of(L'\\')) + L"\\backup";    CreateDirectory(backupDir.c_str(), NULL);        std::wstring fileName = filePath.substr(filePath.find_last_of(L'\\') + 1);    g_backupFile = backupDir + L"\\original_" + fileName;        if (CopyFile(filePath.c_str(), g_backupFile.c_str(), FALSE))    {      LogMessage(L"已创建备份: " + g_backupFile);      return true;    }    else    {      LogMessage(L"创建备份失败!");      return false;    }}// 修改EXE标题bool ModifyExeTitle(const std::wstring& filePath, const std::wstring& oldTitle, const std::wstring& newTitle){    LogMessage(L"开始修改标题...");        std::ifstream file(filePath, std::ios::binary | std::ios::ate);    if (!file.is_open())    {      LogMessage(L"无法打开文件: " + filePath);      return false;    }        std::streamsize size = file.tellg();    file.seekg(0, std::ios::beg);        std::vector<char> buffer(size);    if (!file.read(buffer.data(), size))    {      LogMessage(L"读取文件失败!");      return false;    }        file.close();        // 转换字符串为多字节格式    int oldTitleSize = WideCharToMultiByte(CP_ACP, 0, oldTitle.c_str(), -1, NULL, 0, NULL, NULL);    std::vector<char> oldTitleMb(oldTitleSize);    WideCharToMultiByte(CP_ACP, 0, oldTitle.c_str(), -1, oldTitleMb.data(), oldTitleSize, NULL, NULL);        int newTitleSize = WideCharToMultiByte(CP_ACP, 0, newTitle.c_str(), -1, NULL, 0, NULL, NULL);    std::vector<char> newTitleMb(newTitleSize);    WideCharToMultiByte(CP_ACP, 0, newTitle.c_str(), -1, newTitleMb.data(), newTitleSize, NULL, NULL);        // 查找并替换标题    char* p = buffer.data();    char* end = p + size - oldTitleMb.size() + 1;    bool found = false;        for (; p < end; ++p)    {      if (memcmp(p, oldTitleMb.data(), oldTitleMb.size() - 1) == 0)      {            found = true;            memcpy(p, newTitleMb.data(), newTitleMb.size() - 1);            LogMessage(L"找到并替换标题!");            break;      }    }        if (!found)    {      LogMessage(L"未找到匹配的标题!");      return false;    }        // 写回文件    std::ofstream outFile(filePath, std::ios::binary | std::ios::trunc);    if (!outFile.write(buffer.data(), size))    {      LogMessage(L"写入文件失败!");      return false;    }        outFile.close();    return true;}// DLL注入bool PatchDllToExe(const std::wstring& exePath, const std::wstring& dllPath){    LogMessage(L"开始DLL注入...");        // 1. 检查DLL文件是否存在    if (GetFileAttributes(dllPath.c_str()) == INVALID_FILE_ATTRIBUTES)    {      LogMessage(L"DLL文件不存在: " + dllPath);      return false;    }        // 2. 获取DLL文件名(仅文件名,不含路径)    std::wstring dllName = dllPath.substr(dllPath.find_last_of(L'\\') + 1);        // 3. 读取EXE文件    std::ifstream exeFile(exePath, std::ios::binary | std::ios::ate);    if (!exeFile.is_open())    {      LogMessage(L"无法打开EXE文件: " + exePath);      return false;    }        std::streamsize size = exeFile.tellg();    exeFile.seekg(0, std::ios::beg);        std::vector<char> buffer(size);    if (!exeFile.read(buffer.data(), size))    {      LogMessage(L"读取EXE文件失败!");      return false;    }        exeFile.close();        // 4. 查找PE文件中的导入表    PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)buffer.data();    if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE)    {      LogMessage(L"无效的DOS头!");      return false;    }        PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)(buffer.data() + dosHeader->e_lfanew);    if (ntHeaders->Signature != IMAGE_NT_SIGNATURE)    {      LogMessage(L"无效的NT头!");      return false;    }        // 5. 查找或创建导入表    // 这里简化处理,实际实现需要更复杂的PE文件操作    // 在实际应用中,建议使用专业的PE解析库        LogMessage(L"DLL注入功能需要更复杂的PE文件操作实现");    LogMessage(L"当前版本仅演示功能,实际注入需要完整实现");        return false;}// 移除窗口控件bool RemoveWindowControl(const std::wstring& exePath, const std::wstring& className, const std::wstring& windowText){    LogMessage(L"开始移除控件...");    LogMessage(L"类名: " + className);    LogMessage(L"窗口文本: " + windowText);        // 在实际应用中,这需要修改EXE的资源段或代码段    // 这里简化处理,实际实现需要更复杂的PE文件操作        LogMessage(L"控件移除功能需要更复杂的PE文件操作实现");    LogMessage(L"当前版本仅演示功能,实际移除需要完整实现");        return false;}
资源文件 (Resource.h)cpp复制
#define IDI_ICON1                     101#define IDC_BROWSE_EXE                  1001#define IDC_BROWSE_EXE_PATCH            1002#define IDC_BROWSE_EXE_REMOVE         1003#define IDC_BROWSE_DLL                  1004#define IDC_MODIFY_TITLE                1005#define IDC_PATCH_EXE                   1006#define IDC_REMOVE_CONTROL            1007

项目完整说明
[*]功能概述:

[*]修改EXE文件标题
[*]DLL注入功能
[*]移除窗口控件功能
[*]文件拖放支持
[*]自动备份功能
[*]详细日志记录
[*]使用方法:

[*]编译后运行程序
[*]通过选项卡切换不同功能
[*]浏览或拖放文件到界面
[*]输入必要参数后执行操作
[*]注意事项:

[*]DLL注入和控件移除功能需要更复杂的PE文件操作,当前版本仅为框架演示
[*]修改EXE文件可能会破坏数字签名
[*]某些杀毒软件可能会误报

这个完整版本已经将所有部分正确衔接,您可以直接在Visual Studio中创建Win32项目并添加这些代码文件进行编译。我将为您提供 Visual Studio 2019 详细到每一步的图文级指南,确保完全匹配您的版本。请严格按以下步骤操作:第一步:创建新项目(精确到每个点击位置)
[*]打开Visual Studio 2019 → 点击起始页的 "创建新项目"
(或顶部菜单栏:文件 → 新建 → 项目)
[*]在搜索框输入 "Windows桌面向导" → 选择 "Windows桌面向导(C++)" → 下一步
(如果找不到,先确认安装时勾选了"C++桌面开发"工作负载)
[*]在配置新项目窗口中:
[*]名称输入 ExeModifier
[*]位置选择您的文件夹(例如 D:\Projects\)
[*]勾选 "将解决方案和项目放在同一目录中" (避免嵌套文件夹)
[*]点击 "创建"

第二步:项目设置(关键步骤!)
[*]此时会弹出 "Windows桌面项目" 配置窗口(这是您找不到的弹窗)
[*]在 "应用程序类型" 选择 "桌面应用程序(.exe)"
[*]在 "附加选项" 中:
✅ 勾选 "空项目"
❌ 取消勾选 "预编译头"
❌ 取消勾选 "安全开发生命周期(SDL)检查"
[*]点击 "确定"
https://i.imgur.com/JQ6GzlA.png
(如果弹窗未出现,说明您可能选错了项目模板)
第三步:添加源代码文件(精确到右键菜单层级)
[*]在右侧 "解决方案资源管理器" 中:
[*]展开项目 → 右键 "源文件" 文件夹
[*]选择:添加 → 新建项
[*]在弹窗中选择 "C++文件(.cpp)" → 名称输入 ExeModifier.cpp → 添加

[*]双击打开 ExeModifier.cpp → 粘贴之前提供的 完整代码(确保无遗漏)
[*]同样方法添加头文件:
[*]右键 "头文件" 文件夹 → 添加 → 新建项
[*]选择 "头文件(.h)" → 名称输入 resource.h → 粘贴对应代码

第四步:修改项目属性(解决编译错误)
[*]右键项目名称 ExeModifier → 选择 "属性"
(注意:是右键项目,不是解决方案!)
[*]左侧选择:配置属性 → 常规 → 找到 "字符集"
[*]修改为 "使用多字节字符集"
[*]点击 "应用"

[*]继续在属性页中:
[*]选择:配置属性 → C/C++ → 预编译头
[*]将 "预编译头" 改为 "不使用预编译头"
[*]点击 "确定" 保存

第五步:编译与生成(逐步验证)
[*]顶部菜单栏选择:
[*]解决方案配置 → "Debug"
[*]解决方案平台 → "x86" (兼容性更好)

[*]点击菜单栏:生成 → "生成解决方案"
[*]首次编译需等待3-5分钟
[*]观察底部 "输出" 窗口,应显示"生成成功"

[*]如果报错:
[*]错误LNK2019:检查是否漏掉了代码的某部分
[*]C2065未声明的标识符:确认 resource.h 已正确添加
[*]其他错误:右键错误 → 选择"显示错误帮助"

第六步:找到生成的EXE文件
[*]在文件资源管理器中打开项目文件夹(默认在您之前选择的路径,如 D:\Projects\ExeModifier)
[*]进入子文件夹:
x86 → Debug → 找到 ExeModifier.exe
(这就是您需要的软件)
特殊问题处理
[*]如果看不到"Windows桌面向导"模板:
[*]打开Visual Studio Installer → 修改 → 确保勾选 "使用C++的桌面开发"
[*]安装后重启VS2019

[*]如果代码粘贴后格式混乱:
[*]全选代码 → 按快捷键 Ctrl+K → Ctrl+F 自动格式化

[*]运行时闪退:
[*]右键EXE文件 → 属性 → 兼容性 → 勾选 "以管理员身份运行"

最终确认请告诉我:
[*]您在哪一步操作后结果与预期不符?
[*]是否有具体的错误截图?
我会针对性提供修复方案。





wangjf1985 发表于 4 天前

你这是AI写的吧

linxiansen 发表于 4 天前

PYG20周年生日快乐!

wpig 发表于 4 天前

收藏了学习下,感谢分享

alexwang 发表于 3 天前

这个不错啊

dengzf 发表于 3 天前

PYG有你更精彩!

lies2014 发表于 3 天前

谢谢分享!
页: [1]
查看完整版本: C语言开发的一款可以修改软件标题的工具导入exe程序对标题进行修改源代码实现方案