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的时间要自己调度好,快了可能改不了标题,慢了原来的标题会显示一会儿;必须主窗口界面显示出来才能修改标题成功,所以对于延时启动类的主窗口要控制好时间。
如果进程的标题确定,那么很简单:
//进程参数,第一个字符串为要启动的进程名称,第二个字符串为进程主窗口原标题,第三个字符串为进程主窗口新标题
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的时间要自己调度好,快了可能改不了标题,慢了原来的标题会显示一会儿;必须主窗口界面显示出来才能修改标题成功,所以对于延时启动类的主窗口要控制好时间。
相关文章推荐
- 如何实现只启动一个exe进程
- 如何在一个进程启动时进行调试?
- C / C++ 如何让程序只启动一个实例
- 对面试题“输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现?”的理解
- Linux:如何查看一个进程的详细的启动时间
- 如何启动一个命令,如何读取程序的一些内容和写一些东西到该进程中?
- 如何实现多进程写一个文件
- Linux:如何查看一个进程的详细的启动时间
- 用C++实现HTTP服务器 - 如何控制一个套接字的发送带宽
- 如何实现开机启动、清缓存、杀进程、悬浮窗口单双击区分,附源码
- Linux:如何查看一个进程的详细的启动时间
- 如何实现多进程写一个文件
- Linux:如何查看一个进程的详细的启动时间
- 我在delphi中用shellExecute启动了一个程序(ftp);然后想做一个等待,只到ftp进程结束,再继续下面的操作,请问如何监控这个进程是否已结束?
- 如何在一个进程中启动另外一个线程:ProcessStartInfo Constructor
- 如何实现开机启动、清缓存、杀进程、悬浮窗口单双击区分,附源码
- 如何实现多进程写一个文件
- Vc 如何启动一个进程
- 如何用C++ union 来 实现一个 C# object
- 标题:如何在dropDownList中实现既能输入一个新值,又能实现下拉选