最好不要用枚举所有窗口,然后对比进程ID的方法,这种方法太慢.

解决方案 »

  1.   

    激活是显示界面?
    用SetActiveWindow
      

  2.   

    激活就需要知道进程窗口句柄等,要么FindWindow等根据窗口名,类名等直接查找到...
      

  3.   

    枚举所有窗口, 但不仅是对比进程ID, 试试下面的代码typedef struct _TASKBARPARAM
    {
    LPARAM lParam;
    WNDENUMPROC UserProc;
    }TASKBARPARAM;BOOL CALLBACK EnumTaskBarWindowsProc(
     HWND hwnd,      // handle to parent window
     LPARAM lParam   // application-defined value
     )
    {
    TASKBARPARAM * pParam;
    WCHAR szWndText[1024];
    int nRetVal;
    pParam = (TASKBARPARAM *)lParam; if(0 != GetWindow(hwnd, GW_OWNER))
    return TRUE; if(FALSE == IsWindowVisible(hwnd))
    return TRUE; szWndText[0] = 0;
    nRetVal = InternalGetWindowText(hwnd, szWndText, 1023);
    if(nRetVal == 0 || szWndText[0] == 0)
    return TRUE; if(wcsicmp(L"Program Manager", szWndText) == 0)
    return TRUE; return pParam->UserProc(hwnd, pParam->lParam);
    }
    BOOL EnumTaskBarWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
    {
    TASKBARPARAM TaskBarParam;
    TaskBarParam.lParam = lParam;
    TaskBarParam.UserProc = lpEnumFunc;
    return EnumWindows(EnumTaskBarWindowsProc, (LPARAM)&TaskBarParam);
    }
      

  4.   

    用SetActiveWindow是需要窗口句柄的,有没有只用进程ID就可以激活的方法?
      

  5.   

    主要还是要获得窗口DWORD   dwProc[1024],   dwLen   =   0;  
      EnumProcesses(dwProc,   sizeof(dwProc),   &dwLen);  
      for   (DWORD   i   =   1;   i   <   dwLen   /   sizeof(DWORD);   i++)  
      {  
      HANDLE     hProc;  
      TCHAR       szProcessName   [256]   =   {0};  
      HMODULE   ahMod[10];  
      DWORD       dwNeeded;  
       
      hProc   =   OpenProcess   (PROCESS_ALL_ACCESS,FALSE,dwProc[i]);  
      if   (hProc)  
      {  
      if   (EnumProcessModules   (hProc,   ahMod,   sizeof(ahMod),   &dwNeeded))  
      {  
      if   (GetModuleBaseName(hProc,   ahMod[0],   szProcessName,   sizeof(szProcessName))){  
      if   (strcmp(szProcessName,_T("3SConf.exe"))==0)   {  
      EnumWindows(EnumWindowsProc,0);                          
      }  
      TRACE("Proc:   %ld   :%s\n",   dwProc[i],   szProcessName);  
      }  
      }  
      CloseHandle   (hProc);  
      }  
      }  
       
      其中EnumWindows(EnumWindowsProc,dwProc[i])是自己写的回调函数:  
       
      BOOL   CALLBACK   _stdcall   EnumWindowsProc(HWND   hWnd,LPARAM   lParam)  
      {  
       
            DWORD     ProcID     =     0;      
            GetWindowThreadProcessId(hWnd,&ProcID);      
            if(ProcID   ==   lParam)  
            {        
                    HWND     pWnd   =   hWnd;  
                    while(GetParent(pWnd)!=NULL)  
      pWnd     =     GetParent(pWnd);          
                    SetActiveWindow(pWnd);  
            }      
            return   TRUE;  
      }   
      

  6.   

    一个进程ID可能会对应有很多窗口,激活窗口只能是指定其中某一个。可以用FindWindowEx来查找窗口,再GetWindowThreadProcessId来判断是否属于目标进程,这种方式比枚举快一些。
      

  7.   

    现在我发现一个问题就是如果我的程序有DirectShow写的视频窗口,如果正在放视频,用上面的方法激活的话,结果是视频窗口跑出来,程序主窗口没出来
      有没有办法找到主窗口?? 就是AfxGetMainWnd获取的窗口???
      

  8.   

    按Alt+Tab键我感觉应该不是用FindWindow来激活窗口的
      

  9.   

    主窗口是编程中的概念,如果程序有多个顶级窗口,只有编写这个程序的人才知道哪个是主窗口。AfxGetMainWnd只是程序内部获取App类中的m_pMainWnd成员,这个成员的值是程序自己设置的,外部无法得到。
      

  10.   

    使用Thread32First获取主GUI thread,然后GetGUIThreadInfo,获取窗口信息。
    具体请参考MSDN.
      

  11.   


    你说的有道理,我估计微软在设计Windows的时候就没有意识到主窗口这个概念, 这样的话我们只能这样来判断了,凡凡是在主线程中创建的,又是弹出创建,没有父窗口/Ower窗口,则这个就是主窗口了