我想向各位请教一个关于获得窗口标题的问题, 不过只是针对部分窗口出现错误, 望高手指教. 我使用方法1: 
ZeroMemory(szWndTitle, sizeof(szWndTitle)); 
GetWindowText(hWnd, szWndTitle, sizeof(TCHAR)*MAX_PATH); 
或SendMessage(hWnd, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)szWndTitle); 
打开有些窗口后,再调用本函数发现会卡在此处GetWindowText(), 不直不会向下运行. 使用方法2: 
ZeroMemory(szWndTitle, sizeof(szWndTitle)); 
LONG lWindowLong = GetWindowLong(hWnd,GWLP_WNDPROC); 
CallWindowProc((WNDPROC)lWindowLong,hWnd,WM_GETTEXT,(WPARAM)sizeof(TCHAR)*MAX_PATH,(LPARAM)szWndTitle); 
打开有些窗口后,再调用本函数CallWindowProc(), 发现会出现微软提供的BUG "C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\src\mfc\wincore.cpp"第442行出现错误, 查看则是RemoveProp(hWnd, _afxOldWndProc); . 使用方法3(根据方法2微软提供的BUG进行修正): 
WNDPROC oldWndProc = (WNDPROC)::GetProp(hWnd, _T("AfxOldWndProc423")); 
CallWindowProc(oldWndProc, hWnd, WM_GETTEXT, (WPARAM)sizeof(TCHAR)*MAX_PATH,(LPARAM)szWndTitle); 
SetWindowLong(hWnd, GWLP_WNDPROC, reinterpret_cast <INT_PTR>(oldWndProc)); 
RemoveProp(hWnd, _T("AfxOldWndProc423")); 
GlobalDeleteAtom(GlobalFindAtom(_T("AfxOldWndProc423"))); //if(wcslen(szWndTitle) <= 0) 
//{ 
// SetWindowLong(hWnd, GWLP_WNDPROC, reinterpret_cast <INT_PTR>(WindowLong)); 
// GetWindowText(hWnd, szWndTitle, sizeof(TCHAR)*MAX_PATH);    //使用此段时会卡住. 不使用此段时不会获得窗口标题. 
//} 

解决方案 »

  1.   

    如下使用不可以吗?CString strTitle;
    CWnd*->GetWindowText(strTitle);如:CString strTitle;
    this->GetWindowText(strTitle);
      

  2.   

    上面的方法跟GetWindowText(hWnd, szWndTitle, sizeof(TCHAR)*MAX_PATH); 性质是一样的.
    还有程序不是MFC写的.
      

  3.   

    如果是本进程应该就使用GetWindowText就够用了,
    察看MSDN:
    GetWindowText cannot retrieve the text of a control in another application.
    我猜想你获取的不是本进程的窗口标题,那就只能使用SendMessage来获取了。
    至于你使用的方法2,3由于不是本进程所以你获取的窗口过程地址也将会是无效的,所以直接使用SendMessage即可。
      

  4.   

    SendMessage(hWnd, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)szWndTitle); 
    也会卡住???最多也就是返的标题不正确吧?某些程序是指哪些?
      

  5.   

    因为是枚举窗口, 然后列出窗口标题, 可是楼上的方法SendMessage(hWnd, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)szWndTitle); 
    还是一样会卡住.
      

  6.   

    不知道你怎么会用如此方法? FindWindow()GetWindowText().
      

  7.   

    SendMessage

    GetWindowText
    应该可行的,一直在使用这个,没有发现问题。。
    LZ能所说哪些窗体是出现了问题吗?让大家也做个参考。。
      

  8.   

    后来发现通过创建一线程去实现可行.DWORD   dwEvent = 0;
    HANDLE  hEvent  = NULL;
    HANDLE  hThread = NULL;
    WNDTEXT wndtext;ZeroMemory(&wndtext,sizeof(WNDTEXT));
    hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
    if( hEvent == NULL )
    return TRUE;wndtext.hWnd  = hWnd;
    wndtext.hEvent= hEvent;
    hThread = CreateThread(NULL,0,ThreadWndProc,(LPVOID)&wndtext,0,NULL);
    if( hThread == NULL )
    {
    CloseHandle(hEvent);
    hEvent = NULL;
    return TRUE;
    }

    dwEvent = WaitForSingleObject(hEvent,1000);
    switch(dwEvent)
    {
    case WAIT_OBJECT_0:
    wcscpy(szWndTitle,wndtext.szTitle);
    break;

    case WAIT_TIMEOUT:
    case WAIT_FAILED:
    TerminateThread(hThread,0);
    break;
    }
    if(hThread)
    {
    CloseHandle(hThread);
    hThread = NULL;
    }
    if(hEvent)
    {
    CloseHandle(hEvent);
    hEvent = NULL;
    }
      

  9.   

    后来发现通过创建一线程去实现可行.DWORD   dwEvent = 0;
    HANDLE  hEvent  = NULL;
    HANDLE  hThread = NULL;
    WNDTEXT wndtext;ZeroMemory(&wndtext,sizeof(WNDTEXT));
    hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
    if( hEvent == NULL )
    return TRUE;wndtext.hWnd  = hWnd;
    wndtext.hEvent= hEvent;
    hThread = CreateThread(NULL,0,ThreadWndProc,(LPVOID)&wndtext,0,NULL);
    if( hThread == NULL )
    {
    CloseHandle(hEvent);
    hEvent = NULL;
    return TRUE;
    }

    dwEvent = WaitForSingleObject(hEvent,1000);
    switch(dwEvent)
    {
    case WAIT_OBJECT_0:
    wcscpy(szWndTitle,wndtext.szTitle);
    break;

    case WAIT_TIMEOUT:
    case WAIT_FAILED:
    TerminateThread(hThread,0);
    break;
    }
    if(hThread)
    {
    CloseHandle(hThread);
    hThread = NULL;
    }
    if(hEvent)
    {
    CloseHandle(hEvent);
    hEvent = NULL;
    }