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

  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()中枚举所有窗口,查找本程序实例  
  132.   
  133. view plain  
  134.   
  135.     HWND   oldHWnd   =   NULL;     
  136.     EnumWindows(EnumWndProc,(LPARAM)&oldHWnd);  //枚举所有运行的窗口     
  137.     if(oldHWnd   !=   NULL)     
  138.     {     
  139.     AfxMessageBox( "本程序已经在运行了 ");     
  140.     ::ShowWindow(oldHWnd,SW_SHOWNORMAL);   //激活找到的前一个程序     
  141.     ::SetForegroundWindow(oldHWnd);       //把它设为前景窗口     
  142.     return   false;                       //退出本次运行     
  143.     }     
  144.   
  145.    
  146.   
  147. 2、添加EnumWndProc窗口过程函数://添加的标识只运行一次的属性名  
  148.   
  149. view plain  
  150.   
  151.     CString   g_szPropName  =  "Your Prop Name ";       //自己定义一个属性名     
  152.     HANDLE    g_hValue  =  (HANDLE)1;                   //自己定义一个属性值     
  153.           
  154.     BOOL   CALLBACK   EnumWndProc(HWND   hwnd,LPARAM   lParam)     
  155.     {     
  156.     HANDLE   h   =   GetProp(hwnd,g_szPropName);     
  157.     if(   h   ==   g_hValue)     
  158.     {     
  159.     *(HWND*)lParam   =   hwnd;     
  160.     return   false;     
  161.     }     
  162.     return   true;     
  163.     }     
  164.   
  165. 3、在主窗口的   OnInitDialog()中添加属性   //设置窗口属性  
  166. SetProp(m_hWnd,g_szPropName,g_hValue);  
  167.   
  168. 再次启动时,先检查当前存在的所有窗口,如果有标题相同的,则把先前运行的窗口当成当前窗口  
  169. 我的程序如下:  
  170.   
  171. view plain  
  172.   
  173.     HWND   hWnd_Exist;     
  174.     hWnd_Exist=::GetDesktopWindow();     
  175.     hWnd_Exist=::GetWindow(hWnd_Exist,GW_CHILD);     
  176.     for(;;)     
  177.     {     
  178.     if(hWnd_Exist==NULL)     
  179.     {     
  180.     break;     
  181.     }     
  182.     char   s[256];     
  183.     memset(s,0,256);     
  184.     ::SendMessage(hWnd_Exist,WM_GETTEXT,255,(LONG)s);     
  185.     if(strstr(s, "****** ")!=NULL)     
  186.     break;     
  187.     hWnd_Exist=::GetWindow(hWnd_Exist,GW_HWNDNEXT);     
  188.     }     
  189.         
  190.     if(hWnd_Exist   !=   NULL)     
  191.     {     
  192.     ::ShowWindow(hWnd_Exist,SW_SHOWNORMAL);     
  193.     ::SetForegroundWindow(hWnd_Exist);     
  194.     exit(0);     
  195.     }    
  196.   
  197.   
  198. 声明一个全局   CMutex   变量:  
  199.   
  200.    
  201.   
  202.    
  203.   
  204.    
  205.   
  206. CMutex   mutexApp(FALSE,   _T( "VPOS2000Server "));   //用此互斥量阻止多个实例  
  207.   
  208. 在你的   CWinApp   类的重载函数:   InitInstance   中加入如下代码:   
  209.   
  210. view plain  
  211.   
  212.     if   (!mutexApp.Lock(1))     
  213.     return   FALSE;     
  214.     ::CreateMutex(NULL, TRUE, m_pszExeName);       
  215.             if(ERROR_ALREADY_EXISTS == GetLastError())       
  216.             {       
  217.                     CWnd* pPrevHwnd =  CWnd::GetDesktopWindow()-> GetWindow(GW_CHILD);       
  218.                     while(pPrevHwnd)       
  219.                     {       
  220.                          if(::GetProp(pPrevHwnd-> GetSafeHwnd(), m_pszExeName))       
  221.                           {       
  222.                               if(pPrevHwnd-> IsIconic())       
  223.                                {       
  224.                                  pPrevHwnd-> ShowWindow(SW_RESTORE);       
  225.                                }       
  226.         
  227.                                pPrevHwnd-> SetForegroundWindow();       
  228.                                pPrevHwnd-> GetLastActivePopup()-> SetForegroundWindow();       
  229.                                return   FALSE;       
  230.                             }       
  231.                             pPrevHwnd   =   pPrevHwnd-> GetWindow(GW_HWNDNEXT);       
  232.                     }       
  233.                     TRACE( "Could  not  fond  frevious instance main window ! ");       
  234.                     return   FALSE;       
  235.             }     
  236.   
  237.   
  238. 创建一个全局的互斥量,每次启动时检查是否存在。  
  239.   
  240.    
  241.   
  242.    
  243.   
  244. view plain  
  245.   
  246.     BOOL   CRTDBApp::OnlyOneInstance()     
  247.     {     
  248.     if(::CreateMutex(NULL, TRUE, "onlyone ") == NULL )      
  249.      {     
  250.     TRACE0( "CreateMutex   error. ");     
  251.     return   FALSE;     
  252.     };     
  253.     if( ::GetLastError()   == ERROR_ALREADY_EXISTS)   {     
  254.         
  255.     CWnd*   pPrevWnd   =   CWnd::FindWindow(NULL, "onlyonehwnd ");     
  256.     if(pPrevWnd)     
  257.     {     
  258.     if(   pPrevWnd-> IsIconic())     
  259.     pPrevWnd-> ShowWindow(SW_RESTORE);     
  260.         
  261.     pPrevWnd-> SetForegroundWindow();     
  262.         
  263.     pPrevWnd-> GetLastActivePopup()-> SetForegroundWindow();     
  264.     return   FALSE;     
  265.     }     
  266.         
  267.     };     
  268.         
  269.     return   TRUE;     
  270.     }     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值