判断指定的进程或程序是否存在方法

VC 判断指定进程是否已经启动 BOOL CTbsDlg::IsOpen(CString strFindFile ) {  PROCESSENTRY32 pe32;  pe32.dwSize = sizeof(pe32);  HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  if( hProcessSnap == INVALID 阅读详情
判断指定的进程或程序是否存在方法
分类: Windows program 2011-06-27 15:14 112人阅读 评论(0) 收藏 举报

一、判断指定程序名的进程是否存在

     BOOL EnumWindows( WNDENUMPROC lpEnumFunc, // pointer to callback function LPARAM lParam //   application-defined value);

       The EnumWindows function enumerates all top-level windows on the screen by passing the handle to each window, in turn, to an application-defined callback function. EnumWindows continues until the last top-level window is enumerated or the callback function returns FALSE.

view plain

    BOOL CALLBACK IpEnumFunc(HWND hwnd,LPARAM lParam)  
    {  
     char wndName[100];  
     ::GetWindowText(hwnd,wndName,sizeof(wndName));  
     if(wndName!="")  
     {  
      if(strcmp(wndName,name1)==0)  
      {  
       WndHnd=hwnd;  
       flag=1;  
         
      }  
      }   
     return 1;  
    }   

 

二、判断指定进程名的进程是否存在

 

view plain

    DWORD GetProcessidFromName(LPCTSTR name)  
    {  
     PROCESSENTRY32 pe;  
     DWORD id=0;  
     HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  
     pe.dwSize=sizeof(PROCESSENTRY32);  
     if(!Process32First(hSnapshot,&pe))  
      return 0;  
     while(1)  
     {  
      pe.dwSize=sizeof(PROCESSENTRY32);  
      if(Process32Next(hSnapshot,&pe)==FALSE)  
       break;  
      if(strcmp(pe.szExeFile,name)==0)  
      {  
       id=pe.th32ProcessID;  
         
       break;  
      }  
       
      
     }  
     CloseHandle(hSnapshot);  
     return id;  
    }  

如果返回值不为零,则存在,否则不存在。

 

三、VC判断程序调用的外部进程是否结束

 

view plain

    PROCESS_INFORMATION pi;  
        STARTUPINFO si;  
        memset(&si,0,sizeof(si));  
        si.cb=sizeof(si);  
        si.wShowWindow=SW_HIDE;  
        si.dwFlags=STARTF_USESHOWWINDOW;  
    bool fRet=CreateProcess(NULL,str.GetBuffer(str.GetLength()),NULL,FALSE,NULL,NORMAL_PRIORITY_CLASS   |   CREATE_NO_WINDOW,NULL,NULL,&si,&pi);  
      
    ///判断  
      
    DWORD   ExitCode;     
      
    ExitCode=STILL_ACTIVE;  
    while(ExitCode==STILL_ACTIVE)   
    {  
       GetExitCodeProcess(pi.hProcess,&ExitCode);  
    }  

四、VC判断进程是否存在?比如我想知道记事本是否运行,要用到哪些函数?

view plain

    enProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,  FALSE,aProcesses[i]);       
      //   取得特定PID的进程名       
      if   (hProcess )       
      {       
      if   ( EnumProcessModules(hProcess,&hMod,sizeof(hMod), &cbNeeded))       
      {       
      GetModuleBaseName( hProcess, hMod,szProcessName,sizeof(szProcessName));       
      //将取得的进程名与输入的进程名比较,如相同则返回进程PID       
      if(!stricmp(szProcessName, InputProcessName))       
      {       
      CloseHandle(hProcess);       
      return   aProcesses[i];       
      }       
      }       
      }//end   of   if   (hProcess)       
      }//end   of   for       
      //没有找到相应的进程名,返回0       
      CloseHandle(hProcess);       
      return   0;       
      }     

也可以枚举得到所有进程的应用程序名,然后和知道应用程序名比较判断。

 

五、实现程序只运行一次的方法

        实现程序只运行一次的方法很多,但是原理都是一样的,就是运行第一次的时候设置一个标记,每次运行的时候检查该标记,如果有就说明已经运行了。

具体实现:

1、在程序初始化的时候   (InitInstance())   枚举所有的窗口,查找本程序的实例是否存在  
2、在主窗口初始化的时候在本窗口的属性列表中添加一个标记,以便程序查找. 
  

部分关键代码 :

1、在App的InitInstance()中枚举所有窗口,查找本程序实例

view plain

    HWND   oldHWnd   =   NULL;   
    EnumWindows(EnumWndProc,(LPARAM)&oldHWnd);  //枚举所有运行的窗口   
    if(oldHWnd   !=   NULL)   
    {   
    AfxMessageBox( "本程序已经在运行了 ");   
    ::ShowWindow(oldHWnd,SW_SHOWNORMAL);   //激活找到的前一个程序   
    ::SetForegroundWindow(oldHWnd);       //把它设为前景窗口   
    return   false;                       //退出本次运行   
    }   

 

2、添加EnumWndProc窗口过程函数://添加的标识只运行一次的属性名

view plain

    CString   g_szPropName  =  "Your Prop Name ";       //自己定义一个属性名   
    HANDLE    g_hValue  =  (HANDLE)1;                   //自己定义一个属性值   
        
    BOOL   CALLBACK   EnumWndProc(HWND   hwnd,LPARAM   lParam)   
    {   
    HANDLE   h   =   GetProp(hwnd,g_szPropName);   
    if(   h   ==   g_hValue)   
    {   
    *(HWND*)lParam   =   hwnd;   
    return   false;   
    }   
    return   true;   
    }   

3、在主窗口的   OnInitDialog()中添加属性   //设置窗口属性
SetProp(m_hWnd,g_szPropName,g_hValue);

再次启动时,先检查当前存在的所有窗口,如果有标题相同的,则把先前运行的窗口当成当前窗口
我的程序如下:

view plain

    HWND   hWnd_Exist;   
    hWnd_Exist=::GetDesktopWindow();   
    hWnd_Exist=::GetWindow(hWnd_Exist,GW_CHILD);   
    for(;;)   
    {   
    if(hWnd_Exist==NULL)   
    {   
    break;   
    }   
    char   s[256];   
    memset(s,0,256);   
    ::SendMessage(hWnd_Exist,WM_GETTEXT,255,(LONG)s);   
    if(strstr(s, "****** ")!=NULL)   
    break;   
    hWnd_Exist=::GetWindow(hWnd_Exist,GW_HWNDNEXT);   
    }   
      
    if(hWnd_Exist   !=   NULL)   
    {   
    ::ShowWindow(hWnd_Exist,SW_SHOWNORMAL);   
    ::SetForegroundWindow(hWnd_Exist);   
    exit(0);   
    }  


声明一个全局   CMutex   变量:

 

 

 

CMutex   mutexApp(FALSE,   _T( "VPOS2000Server "));   //用此互斥量阻止多个实例

在你的   CWinApp   类的重载函数:   InitInstance   中加入如下代码: 

view plain

    if   (!mutexApp.Lock(1))   
    return   FALSE;   
    ::CreateMutex(NULL, TRUE, m_pszExeName);     
            if(ERROR_ALREADY_EXISTS == GetLastError())     
            {     
                    CWnd* pPrevHwnd =  CWnd::GetDesktopWindow()-> GetWindow(GW_CHILD);     
                    while(pPrevHwnd)     
                    {     
                         if(::GetProp(pPrevHwnd-> GetSafeHwnd(), m_pszExeName))     
                          {     
                              if(pPrevHwnd-> IsIconic())     
                               {     
                                 pPrevHwnd-> ShowWindow(SW_RESTORE);     
                               }     
      
                               pPrevHwnd-> SetForegroundWindow();     
                               pPrevHwnd-> GetLastActivePopup()-> SetForegroundWindow();     
                               return   FALSE;     
                            }     
                            pPrevHwnd   =   pPrevHwnd-> GetWindow(GW_HWNDNEXT);     
                    }     
                    TRACE( "Could  not  fond  frevious instance main window ! ");     
                    return   FALSE;     
            }   


创建一个全局的互斥量,每次启动时检查是否存在。

 

 

view plain

    BOOL   CRTDBApp::OnlyOneInstance()   
    {   
    if(::CreateMutex(NULL, TRUE, "onlyone ") == NULL )    
     {   
    TRACE0( "CreateMutex   error. ");   
    return   FALSE;   
    };   
    if( ::GetLastError()   == ERROR_ALREADY_EXISTS)   {   
      
    CWnd*   pPrevWnd   =   CWnd::FindWindow(NULL, "onlyonehwnd ");   
    if(pPrevWnd)   
    {   
    if(   pPrevWnd-> IsIconic())   
    pPrevWnd-> ShowWindow(SW_RESTORE);   
      
    pPrevWnd-> SetForegroundWindow();   
      
    pPrevWnd-> GetLastActivePopup()-> SetForegroundWindow();   
    return   FALSE;   
    }   
      
    };   
      
    return   TRUE;   
    }   


windows powershell 判断 进程号是否存在 虽然这不是纯 PowerShell 的方法,但你可以在 PowerShell 中使用 C# 的 .NET Framework 类来检查进程是否存在。你也可以使用 tasklist 命令,并通过 PowerShell 调用它来检查进程是否存在。如果该进程存在,Get-Process 命令会返回该进程的信息;在 Windows PowerShell 中,你可以使用多种方法来检查一个特定的进程号(PID)是否存在。以上方法中的任何一种都可以帮助你判断一个特定的进程号(PID)是否存在。 阅读详情

相关推荐

C++判断进程是否存在

判断进程是否存在,使用遍历所有进程方法,查看所找的进程信息

C++ 判断进程是否存在

一、判断指定程序名的进程是否存在 BOOL EnumWindows( WNDENUMPROC lpEnumFunc, // pointer to callback function LPARAM lParam // application-defined value); The EnumWindows function enumerates all top-level windows on the screen by passing the handle to each window, in turn

顺其自然~专栏 6920

PCB Layout总结

PCB Layout作为硬件设计中的一个环节,也是很重要的一个环节;在硬件电路设计合理的情况下,他其实是影响性能的一个绝对重要的指标。现在很多的PCB Layout工程师都是按照硬件工程师或者PI SI工程师给出的约束规则来完成布局布线的,这些也就是俗称的 “拉线工”。他们重复而机械的完成一块块PCB设计,一段时间设计后,他们中的一些或许已经有了这样的一些经验:哪些要做等长,哪些要走粗、哪些要平...

xydlxd118的博客 2583

C/C++ 判断进程是否存在

用于检查指定名称的进程是否存在。它通过遍历系统中的所有进程,对比输入的进程名(不区分大小写)与快照中的进程名,以判断是否存在指定进程。需要注意的是,当前进程需要具备足够的权限才能打开其他进程的快照。在实际运行时,确保以管理员权限运行或具备足够的权限以避免访问限制。函数获取第一个进程信息。在遍历过程中,将进程名转换为小写,并与输入的进程名进行比较。如果存在与输入名称匹配的进程,则返回。如果存在该进程,输出"存在";函数创建一个进程相关的快照句柄。函数:该函数接受一个进程名(,表示未找到匹配的进程。

微软技术分享 1万+

【数据挖掘】心跳信号分类预测 之 特征工程 —— 学习笔记(三)

三、特征工程 3.1 看书 常言道,“巧妇难为无米之炊”。在 ML 中,数据和特征将作“米”,模型和算法则为“妇”。若无数量充足的数据、良好表示的特征,再强大的模型也难以得到满意的结果 (garbage in,garbage out)。对于 ML 问题,数据和特征往往决定了结果的上限,而模型、算法的选择及优化则是在逐步接近该上限。 特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。在本质上,特征工程是一个表示和展现数据的过程。在实际中,特征工程旨在去除...

闻韶 3359

Anki小白必看:手把手教你打造高颜值个性化笔记模板(附Leaflyer模板下载)

本文为Anki新手提供详细的个性化笔记模板设计指南,从基础配置到高级定制技巧,帮助用户打造高效记忆系统。特别推荐Leaflyer模板下载,通过视觉优化和功能强化,显著提升学习体验和记忆效率。

weixin_28717969的博客 433

我寫的進程處理類---方便新建,結束,和查看進程!

/*------------------------------------ Author: Ted--Nefarian Zhu Date: 2011/04/20 03:30 Version: V1.00 All rights reserved ! Life

442

秦时明月6.2魔改版_从零到一部署指南_含安卓客户端配置与GM后台直通

本文提供《秦时明月》6.2魔改版从零开始的完整部署指南。详细讲解CentOS服务器环境准备、服务端文件部署与安装、关键端口开放及进程验证。重点涵盖安卓客户端APK的IP修改与重签名方法,并介绍了GM后台工具的访问与使用,助你快速搭建并管理专属游戏服务器。

garlic的博客 313

Ubuntu 24.04 极速部署 Dify:从零到一的保姆级实践

本文详细介绍了在Ubuntu 24.04系统上快速部署Dify的完整教程,从环境准备到部署验证,再到深度优化和安全加固,提供了一套保姆级的实践指南。通过使用Docker和Docker Compose,结合国内镜像源加速,帮助用户高效完成Dify的安装和配置,确保系统稳定运行。

weixin_42662293的博客 247

TI单芯片毫米波雷达1642demo代码走读(一)

今天我们来实际看下代码。 首先使用CCS软件导入demo工程,工程有两个,一个是ARM的工程,工程名是mmw_mss_16xx;另一个是DSP的工程,工程名为mmw_dss_16xx。我们将这两个工程的主函数打开,分别位于mss_main.c和dss_main.c文件中。 先看mss的主函数,代码如下。我为每行代码都加了中文注释和自己的理解。 int main (void) { Task_Params taskPara...

1万+

判断进程是64bit还是32bit

#pragmaregion Includes#include<stdio.h>#include <windows.h>#pragmaendregionBOOL DoesWin32MethodExist(PCWSTR pszModuleName, PCSTR pszMethodName){HMODULE hModule = GetModuleHandle(pszModule...

weixin_30421809的博客 102

大模型系列——Ollama-OCR 简明教程

Llama 3.2-Vision 是一个多模态大型语言模型,有 11B 和 90B 两种大小,能够处理文本和图像输入以生成文本输出。该模型在视觉识别、图像推理、图像描述和回答与图像相关的问题方面表现出色,在多个行业基准测试中优于现有的开源和闭源多模态模型。在本文中,我将介绍如何调用由 Ollama 运行的 Llama 3.2-Vision 11B 建模服务并使用实现图像文本识别 (OCR) 功能。

2401_84052244的博客 1万+

判断进程是否存在的几种方法

判断进程是否存在的几种方法 参考 判断进程是否存在的几种方法 注意 通过 pid 去判断一个程序是否还在运行并不是很妥当,因为: 因为内核会在进程消亡时回收进程ID,这个 ID 可能被分配给其他进程,所以随着时间的推移,相同的进程ID可能指向不同的进程。 一个进程 ID 存在,但是该进程是一个僵尸进程(例如,一个已经死亡,但其父进程还没有执行 wait() 来获得其终止状态的进程) 方法一:发送 0 号信号法 当向一个进程发送 0 号信号(所谓的 null 信号)时,该信号并不会被真的发送,但

春风曳海棠的博客 7678

【RT-DETR有效改进】全新的SOATA轻量化下采样操作ADown(轻量又涨点,附手撕结构图)

本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的ADown模块来改进我们的Conv模块,其中YOLOv9针对于这个模块并没有介绍,只是在其项目文件中用到了,我将其整理出来用于我们的YOLOv8的项目,经过实验我发现该卷积模块(作为下采样模块)首先可以大幅度降低参数值,其次其精度上也有很高的提升,同时本文的内容目前网络上并无其它人总结(也是最新发布的,可以说BUff是集满了)大家可以尝试以下在自己数据集上的效果。

Snu77的博客 4774

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

python判断一个进程是否存在的3种方法

在python中,如何判断一个进程是否存在呢?可以使用Popen执行shell命令判断进程是否存在,或者检查/proc 目录下是否存在进程相对应的目录,最佳的方法是向进程发送信号0, 下面分别介绍 1. Popen 使用subprocess模块的Popen执行shell 命令,ps -ef | grep 126055 会筛选出进程执行命令中带有126055 的进程信息。 import subprocess pid = 126055 p = subprocess.Popen('ps -ef | grep.

KWSY2008的专栏 5618

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

QT使用QProcess类,判断某个进程是否存在

前言 需求是判断win系统中,Qt 拉起某个程序,如果程序不存在则拉起,存在则实现程序进程切换,如果要进行这样的逻辑操作,就必须要判断程序的进程是在存在,是否已经启动成功!下面是实现代码。 实现代码 bool IsProcessExist(const QString &processName) { QProcess process; process.start("tasklist"); process.waitForFinished(); QByteArray r

波风水门 8452

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C#判断当前启动程序进程是否存在

System.Threading.Mutex mutex;//注意,此变量要定义为成员变量,而不是局部变量   bool CheckMultiInstance()         {             bool createdNew = true;             mutex = new System.Threading.Mutex(true, "_TEST_Mutex_",

haylhf的专栏 7928

java 根据指定进程名判断是否存在

我整理的一些关于【Java】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/bLN8S1如何在Java中判断指定进程是否存在 在软件开发中,判断指定进程是否存在的功能是一个常见需求。本文将教你如何使用Java实现这一功能,适合刚入行的新手理解。整个过程可以分成几个简单的步骤。...

weixin_40768179的博客 277

VC判断指定程序是否运行,杀掉指定进程

#include /* 名称:        IsRunning 描述:        判断某进程是否存在 参数: lpszProcessFileName[in]:Pointer to a null-terminated string specifying the name of the executable file for the process 返回: If the proc

qq1134993111的专栏 1364
上一篇: 在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)
下一篇: CListCtrl 使用技巧
M-先生
博客等级 码龄17年 60粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值