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

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

     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.

[c-sharp]  view plain copy
  1. BOOL CALLBACK IpEnumFunc(HWND hwnd,LPARAM lParam)  
  2. {  
  3.  char wndName[100];  
  4.  ::GetWindowText(hwnd,wndName,sizeof(wndName));  
  5.  if(wndName!="")  
  6.  {  
  7.   if(strcmp(wndName,name1)==0)  
  8.   {  
  9.    WndHnd=hwnd;  
  10.    flag=1;  
  11.      
  12.   }  
  13.   }   
  14.  return 1;  
  15. }   

 

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

 

[c-sharp]  view plain copy
  1. DWORD GetProcessidFromName(LPCTSTR name)  
  2. {  
  3.  PROCESSENTRY32 pe;  
  4.  DWORD id=0;  
  5.  HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  
  6.  pe.dwSize=sizeof(PROCESSENTRY32);  
  7.  if(!Process32First(hSnapshot,&pe))  
  8.   return 0;  
  9.  while(1)  
  10.  {  
  11.   pe.dwSize=sizeof(PROCESSENTRY32);  
  12.   if(Process32Next(hSnapshot,&pe)==FALSE)  
  13.    break;  
  14.   if(strcmp(pe.szExeFile,name)==0)  
  15.   {  
  16.    id=pe.th32ProcessID;  
  17.      
  18.    break;  
  19.   }  
  20.    
  21.   
  22.  }  
  23.  CloseHandle(hSnapshot);  
  24.  return id;  
  25. }  

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

 

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

 

[c-sharp]  view plain copy
  1. PROCESS_INFORMATION pi;  
  2.     STARTUPINFO si;  
  3.     memset(&si,0,sizeof(si));  
  4.     si.cb=sizeof(si);  
  5.     si.wShowWindow=SW_HIDE;  
  6.     si.dwFlags=STARTF_USESHOWWINDOW;  
  7. bool fRet=CreateProcess(NULL,str.GetBuffer(str.GetLength()),NULL,FALSE,NULL,NORMAL_PRIORITY_CLASS   |   CREATE_NO_WINDOW,NULL,NULL,&si,&pi);  
  8.   
  9. ///判断  
  10.   
  11. DWORD   ExitCode;     
  12.   
  13. ExitCode=STILL_ACTIVE;  
  14. while(ExitCode==STILL_ACTIVE)   
  15. {  
  16.    GetExitCodeProcess(pi.hProcess,&ExitCode);  
  17. }  

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

[c-sharp]  view plain copy
  1. enProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,  FALSE,aProcesses[i]);       
  2.   //   取得特定PID的进程名       
  3.   if   (hProcess )       
  4.   {       
  5.   if   ( EnumProcessModules(hProcess,&hMod,sizeof(hMod), &cbNeeded))       
  6.   {       
  7.   GetModuleBaseName( hProcess, hMod,szProcessName,sizeof(szProcessName));       
  8.   //将取得的进程名与输入的进程名比较,如相同则返回进程PID       
  9.   if(!stricmp(szProcessName, InputProcessName))       
  10.   {       
  11.   CloseHandle(hProcess);       
  12.   return   aProcesses[i];       
  13.   }       
  14.   }       
  15.   }//end   of   if   (hProcess)       
  16.   }//end   of   for       
  17.   //没有找到相应的进程名,返回0       
  18.   CloseHandle(hProcess);       
  19.   return   0;       
  20.   }     

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

 

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

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

具体实现:

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

部分关键代码 :

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

[c-sharp]  view plain copy
  1. HWND   oldHWnd   =   NULL;   
  2. EnumWindows(EnumWndProc,(LPARAM)&oldHWnd);  //枚举所有运行的窗口   
  3. if(oldHWnd   !=   NULL)   
  4. {   
  5. AfxMessageBox( "本程序已经在运行了 ");   
  6. ::ShowWindow(oldHWnd,SW_SHOWNORMAL);   //激活找到的前一个程序   
  7. ::SetForegroundWindow(oldHWnd);       //把它设为前景窗口   
  8. return   false;                       //退出本次运行   
  9. }   

 

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

[c-sharp]  view plain copy
  1. CString   g_szPropName  =  "Your Prop Name ";       //自己定义一个属性名   
  2. HANDLE    g_hValue  =  (HANDLE)1;                   //自己定义一个属性值   
  3.     
  4. BOOL   CALLBACK   EnumWndProc(HWND   hwnd,LPARAM   lParam)   
  5. {   
  6. HANDLE   h   =   GetProp(hwnd,g_szPropName);   
  7. if(   h   ==   g_hValue)   
  8. {   
  9. *(HWND*)lParam   =   hwnd;   
  10. return   false;   
  11. }   
  12. return   true;   
  13. }   

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

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

[c-sharp]  view plain copy
  1. HWND   hWnd_Exist;   
  2. hWnd_Exist=::GetDesktopWindow();   
  3. hWnd_Exist=::GetWindow(hWnd_Exist,GW_CHILD);   
  4. for(;;)   
  5. {   
  6. if(hWnd_Exist==NULL)   
  7. {   
  8. break;   
  9. }   
  10. char   s[256];   
  11. memset(s,0,256);   
  12. ::SendMessage(hWnd_Exist,WM_GETTEXT,255,(LONG)s);   
  13. if(strstr(s, "****** ")!=NULL)   
  14. break;   
  15. hWnd_Exist=::GetWindow(hWnd_Exist,GW_HWNDNEXT);   
  16. }   
  17.   
  18. if(hWnd_Exist   !=   NULL)   
  19. {   
  20. ::ShowWindow(hWnd_Exist,SW_SHOWNORMAL);   
  21. ::SetForegroundWindow(hWnd_Exist);   
  22. exit(0);   
  23. }  

声明一个全局   CMutex   变量:

 

 

 

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

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

[c-sharp]  view plain copy
  1. if   (!mutexApp.Lock(1))   
  2. return   FALSE;   
  3. ::CreateMutex(NULL, TRUE, m_pszExeName);     
  4.         if(ERROR_ALREADY_EXISTS == GetLastError())     
  5.         {     
  6.                 CWnd* pPrevHwnd =  CWnd::GetDesktopWindow()-> GetWindow(GW_CHILD);     
  7.                 while(pPrevHwnd)     
  8.                 {     
  9.                      if(::GetProp(pPrevHwnd-> GetSafeHwnd(), m_pszExeName))     
  10.                       {     
  11.                           if(pPrevHwnd-> IsIconic())     
  12.                            {     
  13.                              pPrevHwnd-> ShowWindow(SW_RESTORE);     
  14.                            }     
  15.   
  16.                            pPrevHwnd-> SetForegroundWindow();     
  17.                            pPrevHwnd-> GetLastActivePopup()-> SetForegroundWindow();     
  18.                            return   FALSE;     
  19.                         }     
  20.                         pPrevHwnd   =   pPrevHwnd-> GetWindow(GW_HWNDNEXT);     
  21.                 }     
  22.                 TRACE( "Could  not  fond  frevious instance main window ! ");     
  23.                 return   FALSE;     
  24.         }   

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

 

 

[c-sharp]  view plain copy
  1. BOOL   CRTDBApp::OnlyOneInstance()   
  2. {   
  3. if(::CreateMutex(NULL, TRUE, "onlyone ") == NULL )    
  4.  {   
  5. TRACE0( "CreateMutex   error. ");   
  6. return   FALSE;   
  7. };   
  8. if( ::GetLastError()   == ERROR_ALREADY_EXISTS)   {   
  9.   
  10. CWnd*   pPrevWnd   =   CWnd::FindWindow(NULL, "onlyonehwnd ");   
  11. if(pPrevWnd)   
  12. {   
  13. if(   pPrevWnd-> IsIconic())   
  14. pPrevWnd-> ShowWindow(SW_RESTORE);   
  15.   
  16. pPrevWnd-> SetForegroundWindow();   
  17.   
  18. pPrevWnd-> GetLastActivePopup()-> SetForegroundWindow();   
  19. return   FALSE;   
  20. }   
  21.   
  22. };   
  23.   
  24. return   TRUE;   
  25. }   

 

你可能感兴趣的:(判断指定的进程或程序是否存在方法)