VC++ 6.0 判断进程"qq.exe"是否存在

各位前辈能否给出详细代码判断进程"qq.exe"是否存在如果存在弹出对话框不存在弹出对话框如果要QQ.exe存在,执行某个函数应该怎么些呢... 各位前辈能否给出详细代码

判断进程"qq.exe"是否存在 如果存在 弹出对话框
不存在 弹出对话框
如果要QQ.exe存在,执行某个函数应该怎么些呢
展开
 我来答
YaNaKaSa
推荐于2016-01-12 · TA获得超过114个赞
知道小有建树答主
回答量:86
采纳率:0%
帮助的人:84.2万
展开全部

(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中的进程同样有效;

百度网友87b4f1c69
2010-06-13 · TA获得超过1218个赞
知道小有建树答主
回答量:760
采纳率:0%
帮助的人:979万
展开全部
楼上的程序可以实现,不过还有点小问题,你能保证进程名是“QQ.exe”还是“qq.exe”,所以在判断之前应将进程取得的名称全部转成大写或者小写,这样判断才不会有问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友80f93b0b5
推荐于2016-01-18
知道答主
回答量:7
采纳率:0%
帮助的人:0
展开全部
刚写了个 测试成功了。

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;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
澄静竹0T
2010-06-18 · 超过67用户采纳过TA的回答
知道小有建树答主
回答量:325
采纳率:0%
帮助的人:198万
展开全部
void CCloseProgram::KillProcess(DWORD pID)
{
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);
}
}

根据进程名 结束当前进程.

没试过系统进程!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zyl102600
2010-06-14 · TA获得超过678个赞
知道小有建树答主
回答量:702
采纳率:100%
帮助的人:717万
展开全部
QQ785932654
回答的正确。
方法对头,逻辑有点小错误。
修改了下

#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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式