本帖最后由 VisualEleven 于 2012-12-23 17:42:28 编辑

解决方案 »

  1.   

    ::EnumWindows(EnumWindowsProc,"无标题 - 记事本");
    BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM )
    {    int nLen = ::GetWindowTextLength(hwnd) + 1;   LPTSTR Caption = new TCHAR[nLen];
        ::GetWindowText(hwnd, Caption, nLen);
    TCHAR szBuf[256]={0};
       if (!::lstrcmp(Caption,(const char*)lParam))
        {
           // cout << (long)hwnd << endl;
    char szTmp[20];
        wsprintf(szTmp,_T("%d|"),(HWND)hwnd);
    wsprintf(szTmp,_T("%c|"),Caption);
        strcat(szBuf,szTmp);
    }
    szBuf[strlen(szBuf)]='\0';
    delete[] Caption;
        return TRUE;
    }
      

  2.   

    EnumWindows的第2个参数,就是传递给EnumWindowsProc的,可以自定义.
    另外我给一个其他方式的实现代码吧,不需要回调函数了,在某些情况下方便些:
    void MyFindWindow(LPCTSTR lpName)
    {
        HWND hWnd=::FindWindowEx(NULL,NULL,NULL,lpName);
        While(hWnd){
            //这个hWnd就是你要的了
            //查找下一个符合条件的窗口
            hWnd=::FindWindowEx(NULL,hWnd,NULL,lpName);
        }
    }
    //调用
    MyFindWindow(_T("无标题 - 记事本"));sign-----------------------------------------------------------------------

      

  3.   

    EnumWindows不是有个参数吗?第二个参数LPARAM参数,可以传递你想要传递的数据。
      

  4.   


    这个方法不好,比如你打开了2个 单文档程序, 都会有“无标题1“之类的标题文字可以说findwindow似乎不能应对子窗口的。enumwindow才是王道
      

  5.   

    请不要似乎,这是我测试并且在多个地方使用过的代码.
    另外,我用的FindWindowEx,不是FindWindow,这两者是不一样的.
    sign-----------------------------------------------------------------------

      

  6.   

    就以本贴的用途来说,楼主是用EnumWindows枚举全部顶级窗口,之后再取每个窗口的标题,找到符合自己需求的.
    那么我在2楼给的代码,就可以直接在FindWindowEx的最后一个参数传递窗口标题,只查找符合需求的全部顶级窗口.
    如果要枚举子窗口(EnumChildWindows),FindWindowEx的第一个参数传递父窗口句柄就可以了.当然,我并不是说FindWindowEx就一定比EnumWindows、EnumChildWindows更好,只是多一种实现方法而已,根据自己的需求去选择.
    比如枚举之后需要判断类名、窗口标题的,那我可以直接在FindWindowEx传递参数,而不需要再次GetClassName、GetWindowText
    比如我在某个类里面需要枚举窗口时,不需要回调函数会方便一些(普通的类成员函数不能当回调函数)
    sign-----------------------------------------------------------------------

      

  7.   

    谢谢楼上各位朋友 我已经解决了这个问题现在出现了新的问题 是 怎么把EnumWindows 函数执行完后,把得到的句柄接收回来,我上面给出的代码 不能接收,需要把TCHAR szBuf[256]={0}; 这句拉到函数外边去,这样能接收但还是有问题,我在VC中测试 每次都返回正确的句柄,但我写成DLL给其他软件调用 出现了句柄重复跌加的情况,就是第一次调试是三个句柄,第二次6个 第三次9个,不过是重复的不知道是哪里有问题,懂的朋友请指点一下,谢谢