是否顺序不知道,反正EnumWindows是用于完成历遍顶层窗口的函数.
http://lu0.126.com

解决方案 »

  1.   

    要是这么简单就不会给150分了。
    EnumWindows遍历的窗口很多,与Task列表中的不符。顺序也不同。
      

  2.   

    ALT-TAB切换任务的顺序就是Z-Order顺序,要得到这个顺序的窗口序列应该不会太难吧.
      

  3.   

    我没找到比EnumWindows更好的方法,不过
    下面的代码在我的Win98SE上测试通过,顺序与Alt+TAB完全一样typedef _ei
    {
    int iSize;//缓冲区大小
    int iHwnd;//返回窗口数目
    HWND *pHwnd;//返回窗口句柄的起始地址
    } EI,*PEI;BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
    {
    if (::GetWindow(hwnd,GW_OWNER)) return TRUE;
    if (!::IsWindowVisible(hwnd)) return TRUE;
    TCHAR cls[256];
    ::GetClassName(hwnd,cls,256);
    if (strcmp(cls,"Shell_TrayWnd")==0) return TRUE;
    if (strcmp(cls,"Progman")==0) return TRUE;
     
    //到此为止,hwnd就是符合要求的窗口的句柄
    //下面的代码你不喜欢的话当然可以换成别的啦
    PEI p=(PEI)lParam;
    if (p->iHwnd==p->iSize)
    {
    if (realloc(p->pHwnd,(p->iSize+10)*sizeof(HWND))==NULL)
    {
    p->iHwnd=-1;//表示内存不足
    return FALSE;
    }
    p->iSize+=10;
    }
    *(p->pHwnd+p->iHwnd)=hwnd;
    p->iHwnd++;
    return TRUE;
    }//下面的函数返回窗口数目,-1表示出错;
    //*pp是窗口句柄数组的首地址,该数组内存应由你负责释放
    int MyAltTab(HWND** pph)
    {
    *pph=NULL;
    EI ei;
    ei.iHwnd=0;
    ei.pHwnd=malloc(10*sizeof(HWND));
    if (ei.pHwnd==NULL) return -1;
    ei.iSize=10;
    if (!EnumWindows(EnumWindowsProc,(LPARAM)&ei))
    {
    free(ei.pHwnd);
    return -1;
    }
    if (ei.iHwnd<1) free(ei.pHwnd);//没必要保留内存
    else *pph=ei.pHwnd;
    return ei.iHwnd;
    }
      

  4.   

    ******
    对不起,刚才的代码粘错了,下面的百分百准确我没找到比EnumWindows更好的方法,不过
    下面的代码在我的Win98SE上测试通过,顺序与Alt+TAB完全一样typedef struct _ei
    {
    int iSize;//缓冲区大小
    int iHwnd;//返回窗口数目
    HWND *pHwnd;//返回窗口句柄的起始地址
    } EI,*PEI;BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
    {
    if (::GetWindow(hwnd,GW_OWNER)) return TRUE;
    if (!::IsWindowVisible(hwnd)) return TRUE;
    TCHAR cls[256];
    ::GetClassName(hwnd,cls,256);
    if (strcmp(cls,"Shell_TrayWnd")==0) return TRUE;
    if (strcmp(cls,"Progman")==0) return TRUE;
     
    //到此为止,hwnd就是符合要求的窗口的句柄
    //下面的代码你不喜欢的话当然可以换成别的啦
    PEI p=(PEI)lParam;
    if (p->iHwnd==p->iSize)
    {
    if (realloc(p->pHwnd,(p->iSize+10)*sizeof(HWND))==NULL)
    {
    p->iHwnd=-1;//表示内存不足
    return FALSE;
    }
    p->iSize+=10;
    }
    *(p->pHwnd+p->iHwnd)=hwnd;
    p->iHwnd++;
    return TRUE;
    }//下面的函数返回窗口数目,-1表示出错;
    //*pp是窗口句柄数组的首地址,该数组内存应由你负责释放
    int MyAltTab(HWND** pph)
    {
    *pph=NULL;
    EI ei;
    ei.iHwnd=0;
    ei.pHwnd=(HWND*)malloc(10*sizeof(HWND));
    if (ei.pHwnd==NULL) return -1;
    ei.iSize=10;
    if (!EnumWindows(EnumWindowsProc,(LPARAM)&ei))
    {
    free(ei.pHwnd);
    return -1;
    }
    if (ei.iHwnd<1) free(ei.pHwnd);//没必要保留内存
    else *pph=ei.pHwnd;
    return ei.iHwnd;
    }