VC++ 6.0 判断进程"qq.exe"是否存在
判断进程"qq.exe"是否存在 如果存在 弹出对话框
不存在 弹出对话框
如果要QQ.exe存在,执行某个函数应该怎么些呢 展开
(0)进程也就是正在运行的程序的实例。
(1)Windows作为分时操作系统,允许多进程并发执行、分时复用CPU,通常来讲,进程存在(运行)是当前参与竞争处理器资源的进程。
(2)由于"同一时刻"有多个进程同时运行,要判断"qq.exe"进程是否属于这些进程,首先要从系统获取这些进程的信息,并从这些进程中找到"qq.exe"进程,如果成功则目标进程正在运行也就是"存在"。
(3)Windows操作系统提供了如下两个函数:
CreateToolhelp32Snapshot获取当前的进程信息(进程快照)和Process32First、Process32Next从进程快照中查找进程信息:
HANDLE WINAPI CreateToolhelp32Snapshot(
__in DWORD dwFlags,
__in DWORD th32ProcessID
);
第一个参数是要获取的进程标识,如果为TH32CS_SNAPPROCESS,则获取系统中所有进程;
第二个参数在使用TH32CS_SNAPPROCESS时被忽略,可以指定为0.
返回当前系统中进程的所有信息的句柄(第一个参数要为TH32CS_SNAPPROCESS).
BOOL WINAPI Process32First(
__in HANDLE hSnapshot,
__inout LPPROCESSENTRY32 lppe
//第一个参数是上面函数的返回值
//第二个参数是指向PROCESSENTRY32结构体的指针
typedef struct tagPROCESSENTRY32 {
DWORD dwSize; //使用前必须指定,且为sizeof( PROCESSENTRY32 )
DWORD cntUsage;
DWORD th32ProcessID;
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
TCHAR szExeFile[MAX_PATH]; //进程所属的文件名(不是全路径名!)
} PROCESSENTRY32,
*PPROCESSENTRY32;
//如果进程集合中有进程返回TRUE,否则返回FALSE.
BOOL WINAPI Process32Next(
__in HANDLE hSnapshot,
__out LPPROCESSENTRY32 lppe
);
//该函数再Process32First后调用,返回进程集合中下一个进程信息
//参数和返回值同第一个
(4)例子
BOOL GetProcessList( )
{
HANDLE hProcessSnap;
PROCESSENTRY32 pe32 = { 0 };
// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if( INVALID_HANDLE_VALUE == hProcessSnap )
{
//GetLastError做出错处理;
return( FALSE );
}
// Set the size of the structure before using it.
pe32.dwSize = sizeof( PROCESSENTRY32 );
// Retrieve information about the first process,
// and exit if unsuccessful
if( !Process32First( hProcessSnap, &pe32 ) )
{
//GetLastError做出错处理;
CloseHandle( hProcessSnap ); // clean the snapshot object
return( FALSE );
}
// Now walk the snapshot of processes, and
// find whether "qq.exe" included or not.
do
{
if( !_tcscmp( pe32.szExeFile , _T("qq.exe") ) )
{
//qq.exe正在运行,要进程的处理
return ( TRUE );
}
} while( Process32Next( hProcessSnap, &pe32 ) );
CloseHandle( hProcessSnap );
return( FALSE );
(5)注意:
虽然CreateToolhelp32Snapshot等函数中含有32,但对 64 位Windows中的进程同样有效;
VC++6.0 XP Win32控制台程序
#include "stdafx.h"
#include"stdio.h"
#include <windows.h>
#include <tlhelp32.h>
void shutdown()
{
// 以下为提权函数,使其用关机权限,
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES
|TOKEN_QUERY,&hToken))
{
printf("OpenProcessToken调用失败");
}
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,false,&tkp,0,
(PTOKEN_PRIVILEGES)NULL,0);
//下面为关机函数
if(!ExitWindowsEx(EWX_SHUTDOWN ,0))
{
printf("关机失败");
}
}
int main(int argc, char* argv[])
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf(" CreateToolhelp32Snapshot调用失败! \n");
return -1;
}
BOOL bMore = ::Process32First(hProcessSnap, &pe32);
while(bMore)
{
printf(" 进程名称:%s \n", pe32.szExeFile);
if(stricmp("QQ.exe",pe32.szExeFile)==0)
{
printf("QQ 运行中,准备关机");
shutdown();
break;
}
bMore = ::Process32Next(hProcessSnap, &pe32);
}
::CloseHandle(hProcessSnap);
printf("QQ 不在运行");
return 0;
}
{
if(pID==0)
{
return;
}
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pID);
if(hProcess!=NULL)
{
TerminateProcess(hProcess,0);
}
CloseHandle(hProcess);
}
void CCloseProgram::FindProcess(CString processName)
{
DWORD processID=0;
PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(pe32);
HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
return;
}
BOOL bMore=Process32First(hProcessSnap,&pe32);
while(bMore)
{
CString fileName= pe32.szExeFile;
processID=pe32.th32ProcessID;
if(processName==fileName)
{
if(GetCurrentProcessId()!=processID)
{
KillProcess(processID);
break;
}
}
bMore=Process32Next(hProcessSnap,&pe32);
}
}
void CCloseProgram::FindProcess(CString processName,bool isKill)
{
DWORD processID=0;
PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(pe32);
HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
return;
}
BOOL bMore=Process32First(hProcessSnap,&pe32);
while(bMore)
{
CString fileName= pe32.szExeFile;
processID=pe32.th32ProcessID;
if(processName==fileName)
{
if(GetCurrentProcessId()==processID)
{
KillProcess(processID);
break;
}
}
bMore=Process32Next(hProcessSnap,&pe32);
}
}
根据进程名 结束当前进程.
没试过系统进程!
回答的正确。
方法对头,逻辑有点小错误。
修改了下
#include"stdio.h"
#include <windows.h>
#include <tlhelp32.h>
int main(int argc, char* argv[])
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf(" CreateToolhelp32Snapshot调用失败! \n");
return -1;
}
BOOL bMore = ::Process32First(hProcessSnap, &pe32);
BOOL bfind = FALSE;
while(bMore)
{
printf(" 进程名称:%s \n", pe32.szExeFile);
if(stricmp("qq.exe",pe32.szExeFile)==0)
{
bfind = TRUE;
break;
}
bMore = ::Process32Next(hProcessSnap, &pe32);
}
::CloseHandle(hProcessSnap);
(bfind == TRUE)
? printf("QQ 运行中\n")
: printf("QQ 不在运行\n");
return 0;
}