强制杀进程和友好通知其关闭

最近在做一个项目时,使用到了第三方的播放软件,需要能关掉它。之前因为只会调用一次,为了关闭的速度,就采用了强制杀掉该播放器进程的方式,然而这次需要多次调用,如果还采用这种强制关的方式,则会导致资源泄露,几次调用后播放器就无法加载解码器,报错说识别不了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;


}

posted @ 2011-04-21 21:49  thinksea  阅读(214)  评论(0编辑  收藏  举报