结束进程

 

1,结束进程需要提升权限,下面是一个结束指定ID进程的程序片段,希望对你又帮助。

这个是完整的代码,pslist函数列出所有进程,killps杀掉指定ID的进程。

#include <windows.h>

#include <stdio.h>

#include <Tlhelp32.h>

 

void pslist(void);

BOOL killps(DWORD id);

BOOL SetPrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege);

 

void pslist(void)

{

 HANDLE hProcessSnap = NULL;

 PROCESSENTRY32 pe32= {0};

 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //创建一个进程快照

 if (hProcessSnap == (HANDLE)-1)

 {

  printf("\nCreateToolhelp32Snapshot() failed:%d",GetLastError());

  return ;

 }

 pe32.dwSize = sizeof(PROCESSENTRY32);  //初始化PROCESSENTRY32结构体

 printf("\nProcessName     ProcessID");

 if (Process32First(hProcessSnap, &pe32))  //第一个进程

 {

  char a[5];

  do         //开始枚举进程

  {

   itoa(pe32.th32ProcessID,a,10);  //转换进程ID号

   printf("\n%-20s%d",pe32.szExeFile,pe32.th32ProcessID); //输出进程名字和ID

  }

  while (Process32Next(hProcessSnap, &pe32));

 }

 else

 {

   printf("\nProcess32Firstt() failed:%d",GetLastError());

 }

 CloseHandle (hProcessSnap);

 return;

}

 

BOOL killps(DWORD id)

{

 HANDLE hProcess=NULL,hProcessToken=NULL;

 BOOL IsKilled=FALSE,bRet=FALSE;

// try

 {

        //获得进程访问令牌的句柄

  if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))

  {

   printf("\nOpen Current Process Token failed:%d",GetLastError());

  // __leave;

  }

  //printf("\nOpen Current Process Token ok!");

  if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE)) //提升权限

  {

  // __leave;

  }

  printf("\nSetPrivilege ok!");

 

  if((hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,id))==NULL) //打开进程

  {

   printf("\nOpen Process %d failed:%d",id,GetLastError());

  // __leave;

  }

  //printf("\nOpen Process %d ok!",id);

  if(!TerminateProcess(hProcess,1))   //关闭进程

  {

   printf("\nTerminateProcess failed:%d",GetLastError());

  // __leave;

  }

  IsKilled=TRUE;

 }

 //__finally

 {

  if(hProcessToken!=NULL) CloseHandle(hProcessToken);

  if(hProcess!=NULL) CloseHandle(hProcess);

 }

 return(IsKilled);

}

 

BOOL SetPrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege)     //提升权限

{

 TOKEN_PRIVILEGES tp;

 LUID luid;

 

 if(!LookupPrivilegeValue(NULL,lpszPrivilege,&luid))  //查询权限GUID

 {

  printf("\nLookupPrivilegeValue error:%d", GetLastError() );

  return FALSE;

 }

 tp.PrivilegeCount = 1;

 tp.Privileges[0].Luid = luid;

 if (bEnablePrivilege)

  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

 else

  tp.Privileges[0].Attributes = 0;

 AdjustTokenPrivileges(              //修改访问令牌

    hToken,

    FALSE,

    &tp,

    sizeof(TOKEN_PRIVILEGES),

    (PTOKEN_PRIVILEGES) NULL,

    (PDWORD) NULL);

 if (GetLastError() != ERROR_SUCCESS)

 {

  printf("AdjustTokenPrivileges failed: %u\n", GetLastError() );

  return FALSE;

 }

 return TRUE;

}

 

 

void main()

{

 pslist();

// killps(2544);

}

2,

首先根据进程名找到该进程的ID,如已知某进程的进程名为Application.exe,可以用列举进程的办法找的该进程的ID(前提是系统中有且只有一个这样的进程):

HANDLE hProcessSnap;

TCHAR ProcessName[]="Application.exe";

DWORD ProcessID=0x00;

hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if(hProcessSnap==INVALID_HANDLE_VALUE)

{

printf("列举进程失败\n");

return ;

}

PROCESSENTRY32 pe32;

pe32.dwSize = sizeof(pe32);

BOOL bProcess = Process32First(hProcessSnap, &pe32);

TCHAR buff[1024];

while(bProcess)

{

if(strcmp(ProcessName,pe32.szExeFile)==0)

{

ProcessID= pe32.th32ProcessID;

break;

}

memset(buff, 0x00, 1024);

bProcess=Process32Next(hProcessSnap, &pe32);

}

if(ProcessID==0)

{

printf("没有找到进程%s", ProcessName);

return;

}

 

然后把ProcessID作为参数,按照下面这篇文章所说的方法得到该进程的主窗口句柄:http://www.vckbase.com/document/viewdoc/?id=404

 

假设得到的句柄为pWnd,然后直接向该窗口发送关闭消息即可:

pWnd->PostMessage(WM_CLOSE); //这种方法是让目标进程自己退出,所以属于安全退出

 

一般程序会默认处理WM_CLOSE消息,所以当向一个进程的主窗口窗口发送WM_CLOSE消息时就可以关闭该进程,不信你可以试试用下面的代码向任务管理器发送WM_CLOSE消息:

HWND hwnd = ::FindWindow("#32770","Windows 任务管理器");

if(hwnd)

{

::PostMessage(hwnd , WM_CLOSE, 0, 0);

}

 

要想让被关闭程序在退出之前完成当前任务,则只有在被关闭程序中添加WM_CLOSE的消息函数OnClose(),在里面作出规定:只有在完成任务后才能退出

你可能感兴趣的:(结束进程)