现在的位置: 首页 > 综合 > 正文

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

2013年01月27日 ⁄ 综合 ⁄ 共 3276字 ⁄ 字号 评论关闭
  1. 判断指定的进程或程序是否存在方法  
  2. 分类: Windows program 2011-06-27 15:14 112人阅读 评论(0) 收藏 举报  
  3.   
  4. 一、判断指定程序名的进程是否存在  
  5.   
  6.      BOOL EnumWindows( WNDENUMPROC lpEnumFunc, // pointer to callback function LPARAM lParam //   application-defined value);  
  7.   
  8.        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.  
  9.   
  10. view plain  
  11.   
  12.     BOOL CALLBACK IpEnumFunc(HWND hwnd,LPARAM lParam)    
  13.     {    
  14.      char wndName[100];    
  15.      ::GetWindowText(hwnd,wndName,sizeof(wndName));    
  16.      if(wndName!="")    
  17.      {    
  18.       if(strcmp(wndName,name1)==0)    
  19.       {    
  20.        WndHnd=hwnd;    
  21.        flag=1;    
  22.            
  23.       }    
  24.       }     
  25.      return 1;    
  26.     }     
  27.   
  28.    
  29.   
  30. 二、判断指定进程名的进程是否存在  
  31.   
  32.    
  33.   
  34. view plain  
  35.   
  36.     DWORD GetProcessidFromName(LPCTSTR name)    
  37.     {    
  38.      PROCESSENTRY32 pe;    
  39.      DWORD id=0;    
  40.      HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);    
  41.      pe.dwSize=sizeof(PROCESSENTRY32);    
  42.      if(!Process32First(hSnapshot,&pe))    
  43.       return 0;    
  44.      while(1)    
  45.      {    
  46.       pe.dwSize=sizeof(PROCESSENTRY32);    
  47.       if(Process32Next(hSnapshot,&pe)==FALSE)    
  48.        break;    
  49.       if(strcmp(pe.szExeFile,name)==0)    
  50.       {    
  51.        id=pe.th32ProcessID;    
  52.            
  53.        break;    
  54.       }    
  55.          
  56.         
  57.      }    
  58.      CloseHandle(hSnapshot);    
  59.      return id;    
  60.     }    
  61.   
  62. 如果返回值不为零,则存在,否则不存在。  
  63.   
  64.    
  65.   
  66. 三、VC判断程序调用的外部进程是否结束  
  67.   
  68.    
  69.   
  70. view plain  
  71.   
  72.     PROCESS_INFORMATION pi;    
  73.         STARTUPINFO si;    
  74.         memset(&si,0,sizeof(si));    
  75.         si.cb=sizeof(si);    
  76.         si.wShowWindow=SW_HIDE;    
  77.         si.dwFlags=STARTF_USESHOWWINDOW;    
  78.     bool fRet=CreateProcess(NULL,str.GetBuffer(str.GetLength()),NULL,FALSE,NULL,NORMAL_PRIORITY_CLASS   |   CREATE_NO_WINDOW,NULL,NULL,&si,&pi);    
  79.         
  80.     ///判断    
  81.         
  82.     DWORD   ExitCode;       
  83.         
  84.     ExitCode=STILL_ACTIVE;    
  85.     while(ExitCode==STILL_ACTIVE)     
  86.     {    
  87.        GetExitCodeProcess(pi.hProcess,&ExitCode);    
  88.     }    
  89.   
  90. 四、VC判断进程是否存在?比如我想知道记事本是否运行,要用到哪些函数?  
  91.   
  92. view plain  
  93.   
  94.     enProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,  FALSE,aProcesses[i]);         
  95.       //   取得特定PID的进程名         
  96.       if   (hProcess )         
  97.       {         
  98.       if   ( EnumProcessModules(hProcess,&hMod,sizeof(hMod), &cbNeeded))         
  99.       {         
  100.       GetModuleBaseName( hProcess, hMod,szProcessName,sizeof(szProcessName));         
  101.       //将取得的进程名与输入的进程名比较,如相同则返回进程PID         
  102.       if(!stricmp(szProcessName, InputProcessName))         
  103.       {         
  104.       CloseHandle(hProcess);         
  105.       return   aProcesses[i];         
  106.       }         
  107.       }         
  108.       }//end   of   if   (hProcess)         
  109.       }//end   of   for         
  110.       //没有找到相应的进程名,返回0         
  111.       CloseHandle(hProcess);         
  112.       return   0;         
  113.       }       
  114.   
  115. 也可以枚举得到所有进程的应用程序名,然后和知道应用程序名比较判断。  
  116.   
  117.    
  118.   
  119. 五、实现程序只运行一次的方法  
  120.   
  121.         实现程序只运行一次的方法很多,但是原理都是一样的,就是运行第一次的时候设置一个标记,每次运行的时候检查该标记,如果有就说明已经运行了。  
  122.   
  123. 具体实现:  
  124.   
  125. 1、在程序初始化的时候   (InitInstance())   枚举所有的窗口,查找本程序的实例是否存在    
  126. 2、在主窗口初始化的时候在本窗口的属性列表中添加一个标记,以便程序查找.   
  127.     
  128.   
  129. 部分关键代码 :  
  130.   
  131. 1、在App的InitInstance()中枚举所有窗口,查找本程序实例  

抱歉!评论已关闭.