用到的函数有:
1.创建进程
BOOL WINAPI CreateProcess(
_In_opt_ LPCTSTR lpApplicationName, //进程的可执行地址,例如:c:\\program files\\tensent\\qq\\bin\\qq.exe
_Inout_opt_ LPTSTR lpCommandLine, //命令行,一般填空,但是如果这里为空的话,第一个参数必须不能为空
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, //进程属性
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程属性
_In_ BOOL bInheritHandles,
_In_ DWORD dwCreationFlags,//创建标记,一般为0,没有标记
_In_opt_ LPVOID lpEnvironment,
_In_opt_ LPCTSTR lpCurrentDirectory,
_In_ LPSTARTUPINFO lpStartupInfo, //结构体指针,结构体STARTUPINFO
_Out_ LPPROCESS_INFORMATION lpProcessInformation //结构体指针, 结构体PROCESS_INFORMATION
);
创建进程代码如下:
HANDLE hProc;
void CCreateProcessDlg::OnBnClickedButton1()//创建进程
{
// TODO: 在此添加控件通知处理程序代码
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
PROCESS_INFORMATION pi;
memset(&pi, 0, sizeof(PROCESS_INFORMATION));
BOOL bCreateSuccess = ::CreateProcess(L"C:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQ.exe",//可执行文件(exe)或模块路径
NULL,//命令行参数
NULL,//默认进程安全性
NULL,//默认线程安全性
FALSE, //指定当前进程内局部不可以被子进程继承
0, //创建进程的标志,这里设为0,不需要
NULL,//使用本进程的环境变量
NULL,//使用本进程的驱动器和目录
&si, &pi);
if (!bCreateSuccess)
{
CString str;
str.Format(L"创建进程失败:%d",GetLastError());
::AfxMessageBox(str);
}
else
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
::AfxMessageBox(L"创建进程成功");
}
}
2.根据窗口名打开进程
涉及到的函数有:
static CWnd* PASCAL FindWindow(
LPCTSTR lpszClassName, //一般为NULL
LPCTSTR lpszWindowName //窗口名,如QQ, 360,不可以带后缀
);
DWORD WINAPI GetWindowThreadProcessId(
_In_ HWND hWnd,
_Out_opt_ LPDWORD lpdwProcessId
);
HANDLE WINAPI OpenProcess( _In_ DWORD dwDesiredAccess, //一般填PROCESS_ALL_ACCESS _In_ BOOL bInheritHandle, _In_ DWORD dwProcessId );
根据窗口名获取进程id,并打开进程代码:
void CCreateProcessDlg::OnBnClickedButton3()//打开进程
{
// TODO: 在此添加控件通知处理程序
DWORD pid;
HWND hQQ = ::FindWindow(NULL, L"QQ");
::GetWindowThreadProcessId(hQQ, &pid);
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (hProc == NULL)
{
CString str;
str.Format(L"%d", (int)pid);
::AfxMessageBox(str);
::AfxMessageBox(TEXT("打开进程失败"));
}
else
{
::AfxMessageBox(TEXT("打开进程成功"));
}
}
3.关闭进程
BOOL WINAPI TerminateProcess(
_In_ HANDLE hProcess,
_In_ UINT uExitCode
);
::TerminateProcess(hProc, 0); //这里hProcess是由打开进程openprocess()函数返回的句柄