C++如何枚举已经打开的窗口,如何获取窗口名称,以及窗口类,最好能给个实例谢谢

解决方案 »

  1.   

    MFC有一套转换机制,MFC的窗口类,可以得到类,如果不是,会给你一个转换后的MFC类,可不一定对
      

  2.   

    HANDLE    hSnapShot = NULL;//进程映像
    int iNum;
    CString myCmd = (CString)CommandLineToArgvW((LPCWSTR)GetCommandLine(),&iNum)[0];//得到当前程序命令行的第一个参数
    int iStart = 0;
    int iEnd = 0;
    while (iStart >= 0)
    {
    iEnd = iStart;
    iStart = myCmd.Find(_T("\\"),iStart + 1);
    }
    if (myCmd.Find(_T("\\"), 0) <0) iEnd = -1;
    myCmd = myCmd.Right(myCmd.GetLength() - iEnd - 1);// 实际运行文件名,不含路径hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//获取当前进程快照
    PROCESSENTRY32 prosInfo;//定义PROCESSENTRY32结构
    prosInfo.dwSize = sizeof(prosInfo);//设置PROCESSENTRY32结构大小BOOL bStatus = Process32First(hSnapShot, &prosInfo);//获得第一个进程的句柄
    while(bStatus)
    {
    CString strName = prosInfo.szExeFile;
    CString strProcessID; // 进程ID
    strProcessID.Format(_T("%d"), prosInfo.th32ProcessID);
    bStatus = Process32Next(hSnapShot, &prosInfo);//下一个
    }CloseHandle(hSnapShot);//关闭快照
      

  3.   

    http://www.vckbase.com/document/viewdoc/?id=1482
      

  4.   

    // 加上头文件
    #include <tlhelp32.h>
      

  5.   

    有一个非常不错的办法,去下个spy4win的程序,用它捕获到的窗口,它还可以生成怎样捕获枚举到这个窗口的VC,VB,Delphi代码.
      

  6.   

    引用的代码是针对进程遍历(可以得到进程的运行程序名和PROCESSID),不适合LZ的问题
    LZ是要得到窗口标题?
    应该用EnumWindows来实现
    这个函数的第一个参数是个回调函数,在回调里写你要显示的东西
    等我找一下代码,网上有现成的
      

  7.   

    三楼给的代码是枚举进程的,不是枚举窗口的,用EnumWindows加上自己写的回调函数就行了
    BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam)
    //这是回调函数,楼主要的窗口标题,窗口类可以通过hwnd ,调用GetWindowLong来获取
      {
      char str[100];
      ::GetWindowText(hwnd,str,sizeof(str));
      buf[n++]=str;
      return 1;
      }
      void CEnumWindowsDlg::OnOK()//这里调用EnumWindows来列举窗口
      {
      // TODO: Add extra validation here
      n=0;
      EnumWindows(lpEnumFunc,NULL);
      int i;
      for(i=0;i<n;i++)
      {
      if(buf!="")
      m_list.AddString(buf.c_str());
      }
      

  8.   

    EnumWindows(EnumWindowsProc, 0); // 枚举窗口BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) // 回调函数
    {
        TCHAR szTitle[200];
        TCHAR szClass[200];
        GetWindowText(hWnd, szTitle, sizeof(szTitle) / sizeof(TCHAR)); // 获取窗口名称
        GetClassName(hWnd, szClass, sizeof(szClass) / sizeof(TCHAR)); // 窗口类    return TRUE;
    }
      

  9.   

    BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lparam) ; //声明::EnumWindows(EnumWindowsProc,0);//调用BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lparam)
    {
    GetClassName();
    GetWindowThreadProcessId();
    GetWindowText();
    .....
    return TRUE ;
    }
      

  10.   

    EnumWindowsProc不可以用来做回调函数的名字吧
      

  11.   

    EnumWindowsProc不可以用来做回调函数的名字吧
    ==========
    可以,回调函数名可以自己随便用,只要不和系统其它API冲突