通过进程ID或进程名获取进程的句柄,可强制关闭进程

通过进程名称获取ID 再用ID获取句柄,

//通过进程ID获取进程句柄
HANDLE GetProcessHandleByID(int nID)
{
    
    
	return OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID);
}

//通过进程名(带后缀.exe)获取进程ID
DWORD GetProcessIDByName(CString pName)
{
    
    
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (INVALID_HANDLE_VALUE == hSnapshot) {
    
    
		return NULL;
	}
	PROCESSENTRY32 pe = {
    
     sizeof(pe) };
	for (BOOL ret = Process32First(hSnapshot, &pe); ret; ret = Process32Next(hSnapshot, &pe)) 
	{
    
    
		CString sTemp = pe.szExeFile;
		if (sTemp.CompareNoCase(pName) == 0)
		{
    
    
			CloseHandle(hSnapshot);
			return pe.th32ProcessID;
		}
	}
	CloseHandle(hSnapshot);
	return 0;
}

// 获取exe命令行参数
void CmdLineToArr(LPTSTR lpCmdLine, CStringArray& saArgv)
{
    
    
	CString strTemp, str;
	strTemp = lpCmdLine;
	strTemp.Trim();

	int nPos = strTemp.Find(_T(' '));
	while(nPos >= 0)
	{
    
    
		str = strTemp.Left(nPos+1);
		str.TrimRight();

		if(str.GetLength() > 0)
		{
    
    
			//如果参数的第一个字符是",那么向后找另一个",之间的是同一个参数
			if(str[0] == _T('"'))
			{
    
    
				int nPos1 = strTemp.Find(_T('"'), 1);
				if(nPos1 > 0)
				{
    
    
					nPos = nPos1;
					str = strTemp.Left(nPos);
					str = str.Mid(1);
				}
			}

			saArgv.Add(str);
		}

		strTemp = strTemp.Mid(nPos+1);
		nPos = strTemp.Find(_T(' '));
	}

	strTemp.Trim();
	if(strTemp.GetLength() > 0)
	{
    
    
		if( (strTemp[0] == _T('"')) && (strTemp[strTemp.GetLength() - 1] == _T('"')) )
			strTemp = strTemp.Mid(1, strTemp.GetLength()-2);

		saArgv.Add(strTemp);
	}

	if(saArgv.GetSize() == 0)
		return;

	/*CString sModelFileName;
	GetModuleFileName(AfxGetInstanceHandle(), sModelFileName.GetBuffer(MAX_PATH+1), MAX_PATH);
	sModelFileName.ReleaseBuffer();
	sModelFileName.Replace(_T('/'), _T('\\'));

	if((nPos = sModelFileName.ReverseFind(_T('\\'))) > 0)
	sModelFileName = sModelFileName.Mid(nPos + 1);

	if(sModelFileName.Right(4).CompareNoCase(_T(".exe")) == 0)
	sModelFileName = sModelFileName.Left(sModelFileName.GetLength() - 4);*/

	CString sFirst = saArgv[0];
	sFirst.Replace(_T('/'), _T('\\'));
	if((nPos = sFirst.ReverseFind(_T('\\'))) > 0)
		sFirst = sFirst.Mid(nPos + 1);

	if(sFirst.Right(4).CompareNoCase(_T(".exe")) == 0)
		/*sFirst = sFirst.Left(sFirst.GetLength() - 4);

		if(sFirst.CompareNoCase(sModelFileName) == 0)*/
		saArgv.RemoveAt(0);
}

………………………………………………………………………………

// CModelApp 初始化

BOOL CModelApp::InitInstance()
{
    
    
	// 如果一个运行在 Windows XP 上的应用程序清单指定要
	// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
	//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// 将它设置为包括所有要在应用程序中使用的
	// 公共控件类。
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	// 创建互斥量,检查错误代码
	HANDLE m_hMutex = CreateMutex(NULL, FALSE, _T("Model"));
	DWORD nRet = GetLastError();
	if (nRet == ERROR_ALREADY_EXISTS)
	{
    
    
		if(MessageBox(NULL,_T("Model程序正在后台运行,是否强制关闭?"), _T("提示"), MB_YESNO | MB_ICONQUESTION) == IDYES)
		{
    
    
			DWORD pId = GetProcessIDByName(_T("Model.exe"));
			HANDLE hCurrent = GetProcessHandleByID(pId);
			if (hCurrent != NULL)
			{
    
    
				// 强制结束进程
				TerminateProcess(hCurrent, 0);
			}
		}
		else
		{
    
    
			CloseHandle(m_hMutex);
			m_hMutex = NULL;
			return FALSE;
		}
	}

	CWinApp::InitInstance();
	
	AfxEnableControlContainer();

	// 创建 shell 管理器,以防对话框包含
	// 任何 shell 树视图控件或 shell 列表视图控件。
	CShellManager *pShellManager = new CShellManager;

	// 标准初始化
	// 如果未使用这些功能并希望减小
	// 最终可执行文件的大小,则应移除下列
	// 不需要的特定初始化例程
	// 更改用于存储设置的注册表项
	// TODO: 应适当修改该字符串,
	// 例如修改为公司或组织名
	SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

	LPTSTR lpCmdLine = GetCommandLine();
	CStringArray saArgs;
	CmdLineToArr(lpCmdLine, saArgs);
	
	CModelDlg dlg;
	m_pMainWnd = &dlg;
	INT_PTR nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
    
    
		// TODO: 在此放置处理何时用
		//  “确定”来关闭对话框的代码
	}
	else if (nResponse == IDCANCEL)
	{
    
    
		// TODO: 在此放置处理何时用
		//  “取消”来关闭对话框的代码

	}

	// 删除上面创建的 shell 管理器。
	if (pShellManager != NULL)
	{
    
    
		delete pShellManager;
	}

	// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
	//  而不是启动应用程序的消息泵。
	return FALSE;
}

猜你喜欢

转载自blog.csdn.net/m0_37251750/article/details/120454959