您的位置:首页 > 编程语言 > C语言/C++

C++如何实现启动一个进程并把该进程的标题改为我的标题

2017-01-12 11:47 435 查看
经常看到网上下载的单机游戏被别人加了个启动程序,在启动程序中加些广告其他的东西,还把游戏的标题都改了,自己也研究了下,其实也很简单,关键的一点无非就是找到启动的游戏窗口的句柄。

如果进程的标题确定,那么很简单:

//进程参数,第一个字符串为要启动的进程名称,第二个字符串为进程主窗口原标题,第三个字符串为进程主窗口新标题

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)
{
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的时间要自己调度好,快了可能改不了标题,慢了原来的标题会显示一会儿;必须主窗口界面显示出来才能修改标题成功,所以对于延时启动类的主窗口要控制好时间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: