我现在找到的办法是:
    1、列出所有顶级窗口;
    2、对每个窗口使用GetWindowThreadProcessID函数列出其所属的进程和线程
    3、排除非指定进程的窗口和窗口所属线程。以上办法感觉不好,顺序是反的,而且不能列出全部线程,那位知道正规办法的请帮帮忙,不胜感激。

解决方案 »

  1.   

    枚举线程
    hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwID);
    Thread32First(hThreadSnap, &ThreadEntry32);
    Thread32Next(hThreadSnap, &ThreadEntry32);
      

  2.   

    LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
    static HWND HbtWnd; switch(uMsg){
    case WM_CREATE:
    HbtWnd = CreateWindow(TEXT("button"),"EnumWindow",WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON,0,0,100,30,hWnd,NULL,hInst,NULL);
    return 0;
    case WM_COMMAND:
    if((HWND)lParam == HbtWnd){
    EnumWindows((WNDENUMPROC)EnumWindowsProc,0);
    return 0;
    }
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    }
    return DefWindowProc(hWnd,uMsg,wParam,lParam);
    }
    BOOL CALLBACK EnumWindowsProc(HWND hwnd, DWORD lParam)

    LRESULT lResult; 
    char lpWindowName[256];

    lResult = ::GetWindowText(hwnd,lpWindowName,255);

    if( lResult ) 

    MessageBox(NULL,lpWindowName,"EnumWin",MB_OK); 

    return TRUE; 
    }
      

  3.   

    晕死,horisly(SUN YAT-SEN UNIVERSITY (逸仙先生))老兄弄错啦,我说的是列举指定进程的所有顶级窗口啦,不是列举系统的所有窗口,哪位大哥有办法的帮帮忙吧。:(
      

  4.   

    可以先通过我上述的方法枚举一个进程的所有线程.
    然后通过 EnumThreadWindows 来获得每个线程的所有窗口.如果这个方法不行,我觉得也可以使用你自己说的方法.
      

  5.   

    非常感谢,有时间我去查查MSDN。结帖了,分给你了,dongfa大哥:)