VC FindWindow、FindWindowEx和EnumWindows

一.  对于有指定的窗口标题名称的窗口用FindWindow就可以满足要求;


二. 对于同一应用程序的多个实例枚举(ViewWnd.exe同时运行了3个实例,要把它们都要枚举出来),可以使用FindWindowEx。例如:


HWND hwndLog=NULL;
 HWND hWnd[10]={NULL,NULL,NULL,NULL};
 int nCount =0;
 do
 {
  hwndLog=::FindWindowEx(NULL,hwndLog,NULL,_T("ViewWnd"),);
  if(hwndLog!=NULL && nCount<10 )
   hWnd[nCount++] = hwndLog;
 }
 while(hwndLog!=NULL);


三. 如果对于题栏自动改变,比如我们要检测 Notepad是不是已运行而事先不知道Notepad的标题栏,显然FindWindow和FindWindowEx都是无能为力的。这种情况我们可以通过枚举 windows任务列表的办法来实现


//我自己对要找到的窗口进行相应的操作


BOOL ProceWndTask(HWND hWnd)
{


...............................
 return TRUE;
}


//定义一个EnumWindows要调用的回调函数
BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam)
{
          TCHAR szClass[256]={0};
          TCHAR szWindow[256]={0};
          ::GetWindowText(hWnd, szWindow, 255); //获取窗口标题
         ::GetClassName(hWnd, szClass, 255); //获取窗口类名称
        if ( ::IsWindow(hWnd) &&   //判断是否为一个窗口
             ::IsWindowVisible(hWnd) &&  //如果指定的窗口及其父窗口具有WS_VISIBLE风格即可见窗口
             (::GetWindowLong(hWnd, GWL_EXSTYLE)&WS_EX_TOOLWINDOW)!=WS_EX_TOOLWINDOW &&
             ::GetWindowLong(hWnd, GWL_HWNDPARENT)==0 )
        {
                  int i=wcslen(szClass);
                  TCHAR* cFind = NULL;
                 cFind = wcsstr(szWindow,_T("ViewWnd"));
                if(cFind)
                {
                       ProceWndTask(hWnd);
               }
         }


}
 return TRUE;
}


然后在我们的程序里可以调用 EnumWindows(EnumWindowProc, NULL)即可

你可能感兴趣的:(api)