如何按照ALT-TAB切换任务的顺序枚举所有的任务窗口呢? 是否顺序不知道,反正EnumWindows是用于完成历遍顶层窗口的函数.http://lu0.126.com 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要是这么简单就不会给150分了。EnumWindows遍历的窗口很多,与Task列表中的不符。顺序也不同。 ALT-TAB切换任务的顺序就是Z-Order顺序,要得到这个顺序的窗口序列应该不会太难吧. 我没找到比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;} ******对不起,刚才的代码粘错了,下面的百分百准确我没找到比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;} 有关多线程同步的问题 这是为什么? 如何通过MF_BYPOSITON来设置菜单??(包涵,实在是没分了....) 多线程使用内存 我做了一个语音通信,但是,我每次把它放到后台运行时,语音质量就明显不好了,而当我把它激活后,语音又好了。这个问题怎么解决? TreeCtrl加载图标 一个发送消息的问题 万分火急!将AVI文件的内容加到一个JPG文件后面,如何才能跳过JPG文件的数据播放AVI 【道友请留步】做一个热点分享工具,流程怎么弄呢? ado连接问题 如何实现象金山词霸里的屏幕取词功能? ::BringWindowToTop(hWnd)为什么不能将hWnd带到最顶层?
EnumWindows遍历的窗口很多,与Task列表中的不符。顺序也不同。
下面的代码在我的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;
}
对不起,刚才的代码粘错了,下面的百分百准确我没找到比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;
}