强制杀进程和友好通知其关闭
最近在做一个项目时,使用到了第三方的播放软件,需要能关掉它。之前因为只会调用一次,为了关闭的速度,就采用了强制杀掉该播放器进程的方式,然而这次需要多次调用,如果还采用这种强制关的方式,则会导致资源泄露,几次调用后播放器就无法加载解码器,报错说识别不了AVI格式(需播放的是AVI文件)
后来改用PostMessage(WM_QUIT)的方式就好了
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam )
{
unsigned long id;
HWND thwnd;
DWORD
dwProssesId;
id=GetWindowThreadProcessId(hwnd,&dwProssesId);
if (dwProssesId==lParam)
{
while((thwnd=GetParent(hwnd))!=NULL)
hwnd=thwnd;
//CString x;
//x.Format(_T("dwProssesId
HWND = %x"),hwnd);
//MessageBox(NULL,x,NULL,MB_OK);
PostMessage(hwnd,WM_QUIT,0,0);
return false;
}
return true;
}
DWORD CDemoDlg::EndPlay()
{
//*
HINSTANCE hKernel = NULL;
HINSTANCE hProcessSnap = NULL;
PROCESSENTRY32 pe32 =
{0};
DWORD dwTaskCount = 0;
CString
strProcessName;
//创建进程映射
hProcessSnap =
(HINSTANCE)CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
//如果失败,就退出
if (hProcessSnap == (HANDLE)-1)
return 0;
dwTaskCount = 0;
//设置保存进程相关内容的变量的结构大小
pe32.dwSize =
sizeof(PROCESSENTRY32);
//获取第一个进程,并将此进程信息写入进程结构的变量pe32中
if
(Process32First(hProcessSnap, &pe32)) {
do {
LPTSTR pCurChar;
if(_tcsstr(pe32.szExeFile, L"\\"))
pCurChar =
_tcsrchr(pe32.szExeFile, '\\');
else
pCurChar =
pe32.szExeFile;
strProcessName.Format(_T("%s"), pCurChar);
if (strProcessName==_T("PLAYER.exe"))
{
//
LcdOff();//关掉背光
/*
HANDLE hProcess;
//根据进程标识,返回进程句柄
hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE,
pe32.th32ProcessID);
//成功的话,终止进程
if (hProcess)
{
if (!TerminateProcess( hProcess, 1 ))
{
CloseHandle( hProcess );
// LcdOn();
return FALSE;
}
CloseHandle( hProcess );
}
*/
//CString strMsg;
//strMsg.Format(_T("th32ProcessID=0x%0x"),pe32.th32ProcessID);
//MessageBox(strMsg);
EnumWindows(EnumWindowsProc,pe32.th32ProcessID);
}
++dwTaskCount; //进程数目加1
}while
(Process32Next(hProcessSnap, &pe32)); //移至下一个进程
}
else
dwTaskCount = 0;
CloseHandle (hProcessSnap);
//
SetTimer(REFLASH_TIMER,REFLASH_DELAY,NULL);
//*/
return 0;
}