MFC 关闭另一个指定的进程问题

原创 2013年12月02日 14:38:07

方法有好几种:

最简单的就是获得窗口的句柄之后,那么可以使用向该窗体发送WM_CLOSE消息的进行进程的关闭。 

下面是几种比较强制杀死的方法:


 

结束进程的函数为BOOL TerminateProcess(

  HANDLE hProcess,

  UINT uExitCode

);

这个函数要求一个进程的handle。而进程的handle可以用进程的ID通过下面的函数来得到。

HANDLE OpenProcess(

  DWORD dwDesiredAccess,

  BOOL bInheritHandle,

  DWORD dwProcessId

);

而这个函数又需要进程的ID,而进程的ID可以通过进程name来的到,也即是通过任务管理器里面的进程的名字来得到。

至于如何通过进程的name,如,QQ.exe。来得到进程的ID则可以用如下方法。

思路如下,通过如下函数得到系统进程的一个快照。

HANDLE WINAPI CreateToolhelp32Snapshot(

  DWORD dwFlags,

  DWORD th32ProcessID

);

通过如下的两个函数来遍历其中每个进程,比较他们的进程的name,最后得到进程的ID。

BOOL WINAPI Process32First(

  HANDLE hSnapshot,

  LPPROCESSENTRY32 lppe

);

BOOL WINAPI Process32Next(

  HANDLE hSnapshot,

  LPPROCESSENTRY32 lppe

);

有了ID那么就可以执行结束进程的操作了。参考函数如下:

 

  1. DWORD GetProcessIdFromName(LPCTSTR name) 
  2.        PROCESSENTRY32 pe; 
  3.        DWORD id 0; 
  4. //请参考msdn,主要是获得windows当前的任务的一个snap(快照)。 
  5.        HANDLE hSnapshot CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
  6.        pe.dwSize sizeof(PROCESSENTRY32); 
  7.        //检索上一步获得的windows的快照的每个进程。First ,next 函数 
  8.        if(!Process32First(hSnapshot,&pe)) 
  9.               return 0; 
  10.        CString name1,name2; 
  11.  
  12.        do 
  13.        
  14.               pe.dwSize sizeof(PROCESSENTRY32); 
  15.               name1=pe.szExeFile; 
  16.               name2=name; 
  17.               name1.MakeUpper(); 
  18.               name2.MakeUpper(); 
  19. //其中参数pe里面有进程信息如name,即在任务管理器里面看到的名字,如qq.exe 
  20. if(strcmp(name1.GetBuffer(0),name2.GetBuffer(0))   ==   0) 
  21.               
  22.                      //记下这个ID,也及时我们要得到的进程的ID 
  23.                      id     pe.th32ProcessID; 
  24.                      break
  25.               
  26.  
  27.               if(Process32Next(hSnapshot,&pe)==FALSE)  
  28.                      break
  29.        while(1); 
  30.        CloseHandle(hSnapshot); 
  31.        return id; 

由进程的ID,结束进程的函数

 

  1. BOOL KillProcessById(DWORD pID) 
  2.        HANDLE Hwnd; 
  3.        bool ret FALSE; 
  4.        Hwnd OpenProcess(PROCESS_TERMINATE SYNCHRONIZE,0,pID); 
  5.        if (Hwnd) 
  6.        
  7.               if (TerminateProcess(Hwnd, 0)) 
  8.               
  9.                      ret true
  10.               
  11.        
  12.        return ret; 

关于结束进程的方法也有其他的一些方法。

1. 上面所说的直接TerminateProcess()

这个方法比较野蛮。但是比较好用。TerminateProcess返回的时候进程已经结束。

2. 发送消息给目标窗口。

直接给目标窗口发送WM_CLOSE,有的程序会修改此消息,变成程序最小化(QQ)。不行就发送WM_QUIT,这个一般都管用的。

BOOL PostMessage(      

    HWND hWnd,

    UINT Msg,

    WPARAM wParam,

    LPARAM lParam

);

这里面有个难点就是,怎么知道目标窗口的hwnd,如果有VC的话,可以用自带的工具SPY++来获得窗口的hwnd,注意程序每次启动后的主窗口hwnd是不是一样的。

由于,发消息成功,并不代表程序也已经结束,所以如果想等目标进程(B)结束后,再继续运行源程序的话(A),要利用以下的方式WaitForSingleObject,参数是进程的handle,通过进程的ID得到。

DWORD WaitForSingleObject(

  HANDLE hHandle,

  DWORD dwMilliseconds

);

而,通过hwnd可以得到进程ID,方法如下。

DWORD GetWindowThreadProcessId     

    HWND hWnd,

    LPDWORD lpdwProcessId

);

参考code如下:

DWORD pID;

//根据hwnd得到进程的ID,pid

GetWindowThreadProcessId(hwnd, &pID)

//得到进程的handle。

HANDLE hp =OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE,FALSE,pid);

//等待直到进程结束。进程结束会发出信号出来。并且 WaitForSingleObject返回WAIT_OBJECT_0。
WaitForSingleObject(hp, INFINITE);

补充一个由进程Id得到窗口ID的方法,由于从网上找到的,没有实验。

进程启动完毕,然后调用函数EnumWindows(EnumWindowsProc,0)  

//EnumWindowsProc是回调函数  

回调函数EnumWindowsProc为:  

 

  1. BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lparam) 
  2. CString strPrompt; 
  3. DWORD ProcId; 
  4. DWORD ThreadId; 
  5. ThreadId=GetWindowThreadProcessId(hwnd,&ProcId) 
  6. if(ProcId==ProcessInfo.dwProcessId) 
  7. HWND targetWin; 
  8. targetWin=hwnd; 
  9. while(true
  10. HWND hTemp; 
  11. hTemp=GetParent(targetWin); 
  12. if(hTemp==NULL) break
  13. else targetWin=hTemp; 
  14.  
  15. char szTemp[255]; 
  16. sprintf(szTemp,"%x",ProcId); 
  17. CString strTemp=szTemp; 
  18. GetWindowText(targetWin,strTemp.GetBuffer(255),255); 
  19. return FALSE; 
  20. else 
  21. return true
  22. }

相关文章推荐

MFC开启与关闭外部进程

MFC开启进程很简单,只需要一句话就可以解决问题:

MFC关闭其他进程

#include void CloseProgram(CString strProgram) { HANDLE handle; //定义CreateToolhelp32Snapshot系统快照句柄 ...
  • mdcire
  • mdcire
  • 2016年12月19日 17:18
  • 399

MFC获得指定进程的ID,路径及终止进程

转载自:http://blog.sina.com.cn/s/blog_a473b7dc0101foir.html 头文件 #include"tlhelp32.h" voidManagerDlg::O...
  • lebao82
  • lebao82
  • 2013年12月05日 15:55
  • 3359

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

vc结束进程的几种方式

1.使用ExitProcess()结束进程   进程只是提供了一段地址空间和内核对象,其运行时通过在其地址空间内的主线程来体现的。当主线程的进入点函数返回时,进程也就随之结束。这种进程的终止方式...

VC创建和结束进程

进程   进程是当前操作系统下一个被加载到内存的、正在运行的应用程序的实例。每一个进程都是由内核对象和地址空间所组成的,内核对象可以让系统在其内存放有关进程的统计信息并使系统能够以此来管理进程,...
  • zww0815
  • zww0815
  • 2012年12月24日 22:21
  • 8433

MFC-打开进程-终止进程

打开一个进程如果想获取操作这个进程的全部权限,则需要提升当前进程的权限,否则会打开失败.但是也有一些人把自己的系统设置得比较薄弱,可以不用提权就操作一些非系统进程. 如果想操作系统进程,靠这些函数提...

MFC获取主exe路径、启动另一个进程、关闭另一个进程、使同時只有一個進程在運行

启动另一个进程 STARTUPINFO startupInfo; CString strStartPath1 = GetMainExeDir() + _T("xxxx\\xxxx.ex...
  • rekrad
  • rekrad
  • 2012年08月22日 17:55
  • 5721

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

MFC退出程序

PostQuitMessage(0); PostMessage(WM_QUIT,0,0);//最常用 3、 ::SendMessage(AfxGetMainWnd()->m_hWnd,WM...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC 关闭另一个指定的进程问题
举报原因:
原因补充:

(最多只允许输入30个字)