void C枚举窗口Dlg::OnBnClickedOk()
{
    //GetDesktopWindow获取桌面的窗口句柄
    //GW_CHILD 获取他的第一个子句柄
    HWND h = ::GetWindow(::GetDesktopWindow(),GW_CHILD);//
    while(h!=NULL){//NULL == 0,如果不等于NULL,就继续执行
        char buff[250]= {0};//全部填充为0
        ::GetWindowTextA(h,(LPSTR)buff,sizeof(buff));
        CString c;
        c.Format("窗口句柄为%d,标题为%s\r\n",h,buff);
        handles+=c;
        h = ::GetWindow(h,GW_HWNDNEXT);//GW_HWNDNEXT  获取他的下一个,也就是邻居,就是他的下一个窗口的句柄
    }
UpdateData(FALSE);//把变量更新到窗口上,TRUE的意思是把窗口的变量更新到变量上

}

void C枚举窗口Dlg::OnBnClickedCancel()
{

    HWND h = ::FindWindow(NULL,NULL);//类名,标题名,为NULL意思为遍历所有的,他是针对桌面窗口查找的,返回值为第一个窗口的句柄
    while(h!=NULL){
    char buff[250]= {0};//全部填充为0
        ::GetWindowTextA(h,(LPSTR)buff,sizeof(buff));
        CString c;
        c.Format("窗口句柄为%d,标题为%s\r\n",h,buff);
        handles+=c;
        h = ::FindWindowEx(0,h,NULL,NULL);
                                            //针对桌面窗口,查找h窗口句柄后面的一个子窗口,后面的NULL就不解释了
    }
    UpdateData(FALSE);//把变量更新到窗口上,TRUE的意思是把窗口的变量更新到变量上

}

BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam){//#define CALLBACK    __stdcall
        CString* s = (CString*)lParam;//把指针引向给s
    char buff[250]= {0};//全部填充为0
        ::GetWindowTextA(hwnd,(LPSTR)buff,sizeof(buff));//获取windows窗口标题
        CString c;
        c.Format("窗口句柄为%d,标题为%s\r\n",hwnd,buff);
        *s+=c;//*s可以理解为变量吧
        return TRUE;//如果返回FALSE的话,则回调函数会停止
}

void C枚举窗口Dlg::OnBnClickedButton1()//推荐使用这个,不推荐使用GetWindow
{
::EnumWindows(EnumWindowsProc,(LPARAM)&handles);//第一个参数为回调函数,他是针对顶级的窗口进行回调,后面的参数为传递给回调函数的值
UpdateData(FALSE);//把变量更新到窗口上,TRUE的意思是把窗口的变量更新到变量上
}

android 枚举运行进程 枚举窗口相关的api_回调函数

android 枚举运行进程 枚举窗口相关的api_android 枚举运行进程_02

android 枚举运行进程 枚举窗口相关的api_android 枚举运行进程_03