经常看到网上下载的单机游戏被别人加了个启动程序,在启动程序中加些广告其他的东西,还把游戏的标题都改了,自己也研究了下,其实也很简单,关键的一点无非就是找到启动的游戏窗口的句柄。
如果进程的标题确定,那么很简单:
//进程参数,第一个字符串为要启动的进程名称,第二个字符串为进程主窗口原标题,第三个字符串为进程主窗口新标题
{
HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);
if (argc > 0)
{
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
BOOL ret = CreateProcess(NULL, argv[0], NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if (ret)
{
if (argc > 2)
{
while (true)
{
Sleep(10);
HWND hWnd = ::FindWindow(NULL, argv[1]);
if (hWnd)
{
while (!IsWindowVisible(hWnd))
{
Sleep(10);
}
SetWindowText(hWnd, argv[2]);
break;
}
}
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
}
return 0;
}
如果进程的标题不确定:
#include <Psapi.h>
#pragma comment(lib,"Psapi.lib")
bool bOk = false;
BOOL CALLBACK wndEnumProc(HWND hWnd, LPARAM lParam)
{
TCHAR* pName = (TCHAR*)lParam;
DWORD dwProcessId = 0;
GetWindowThreadProcessId(hWnd, &dwProcessId);
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId);
HMODULE hModule;
DWORD cbNeed = 0;
if (hProcess && EnumProcessModules(hProcess, &hModule, sizeof(hModule), &cbNeed))
{
TCHAR path[MAX_PATH] = _T("");
GetModuleBaseName(hProcess, hModule, path, MAX_PATH); //相对路径的
if (wcscmp(path, pName) == 0)
{
SetWindowText(hWnd, _T("我的标题"));
bOk = true;
}
GetModuleFileNameEx(hProcess, hModule, path, MAX_PATH); //绝对路径的
if (wcscmp(path, pName) == 0)
{
SetWindowText(hWnd, _T("我的标题"));
bOk = true;
}
}
return TRUE;
}
//进程参数,第一个字符串为要启动的进程名称
int _tmain(int argc, _TCHAR* argv[])
{
HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);
if (argc > 0)
{
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
BOOL ret = CreateProcess(NULL, argv[0], NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if (ret)
{
while (!bOk)
{
Sleep(50);
EnumWindows(wndEnumProc, (LPARAM)argv[0]);
}
//WaitForSingleObject(pi.hProcess, INFINITE); //等待进程退出
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
}
return 0;
}
相对路径与绝对路径根据具体情况决定使用哪种。
要注意的是,Sleep的时间要自己调度好,快了可能改不了标题,慢了原来的标题会显示一会儿;必须主窗口界面显示出来才能修改标题成功,所以对于延时启动类的主窗口要控制好时间。