【MFC进阶】01进程

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()函数返回的句柄
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperJun12345

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值