MFC 创建进程,获取进程,关闭进程

用到的函数有:
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()函数返回的句柄

你可能感兴趣的:(MFC 创建进程,获取进程,关闭进程)