在系统中检测指定的窗口是否已经打开,检查某进程是否存在

LPCTSTR s_AppName = _T("ABCDEFG");//欲查找的线程ID.(SetProp函数指定的项)
UINT s_AppMagic = 1024;

//防止重复打开窗口
HANDLE handSemp = CreateSemaphore(NULL , 0 , 1 , s_AppName);//创建基于指定名字的信号量
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
 HWND hwndPre = ::GetWindow(::GetDesktopWindow(), GW_CHILD);/*如果指定窗口是父窗口,则获得的是在Z序顶端的子窗口的句柄,否则为NULL。*/
 while(::IsWindow(hwndPre))
 {
  if (::GetProp(hwndPre, s_AppName) == (HANDLE)s_AppMagic)/*如果属性表中包含了给定的字符串,那么返回值为相关的数据句柄。否则,返回值为NULL。 */
  {
   //此处即已在系统中找到了指定线程
   if (::IsIconic(hwndPre)) //确定给定窗口是否是最小化(图标化)的窗口
   {
    ::ShowWindow(hwndPre, SW_RESTORE);/*激活并显示窗口。SW_RESTORE:如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。 */
   }
   ::SetForegroundWindow(hwndPre);/*将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。*/
  }
  hwndPre = GetWindow(hwndPre, GW_HWNDNEXT);
 }
}

 

 

 

 

检查某进程是否存在:

PROCESSENTRY32 *info = new PROCESSENTRY32;  
 // 在使用这个结构之前,先设置它的大小   
 info->dwSize = sizeof(PROCESSENTRY32 );   
 CString  proName = {"devenv.exe"};   
 HANDLE handlePro = NULL; //结束进程句柄   
 // 给系统内的所有进程拍一个快照   
 HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);   
 if(hProcessSnap == INVALID_HANDLE_VALUE)   
 {   
  printf(" CreateToolhelp32Snapshot调用失败! /n");   
  return -1;   
 }   
 // 遍历进程快照,轮流显示每个进程的信息   
 BOOL bMore = ::Process32First(hProcessSnap, info);   
 BOOL terminate = FALSE;   
 while( bMore != FALSE)   
 {   
  if(proName.CompareNoCase(info->szExeFile) == 0)   
  {   
   handlePro=OpenProcess(PROCESS_TERMINATE, FALSE, info->th32ProcessID);   
   if (NULL == handlePro)   
   {   
    break;   
   }   
   //结束进程   
   terminate = TerminateProcess(handlePro, 0);   
  }   
  bMore = Process32Next(hProcessSnap, info);   
 }   
 ::CloseHandle(hProcessSnap); //关闭该进程
 return 1;

你可能感兴趣的:(null)