其实我要实现的功能非常的简单,就是B窗口获得A窗口上CIPAddressCtrl控件的值。
在A窗口上获得很好弄,
CIPAddressCtrl* m_Address=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1);
这一句话就行了,但是跨窗口访问就太难了。我查了一下,需要API函数GetDlgItem(hWnd,IDC_IPADDRESS1)
这样来弄,其中hWnd是A窗口的句柄,但是B窗口如何获得A窗口的句柄呢?我试了好多方法都不行,请大家帮帮忙! 
另外我在百度发了贴,有两个回答:
1:太简单了,让别人回答
2:用个全局变量来保存A窗口的指针。(但我不知道何时在哪里如何来获得A窗口的指针)希望大侠们给出具体代码。
谢谢!

解决方案 »

  1.   

    A窗口的handle,用Findwindow就可以获得。A上面的控件,相当于一个子窗口觉得有点困难。期待有更好的解答。
      

  2.   

    不行啊,我是这样试FindWindow的
    HWND   hWnd   =   ::FindWindow(NULL,"Example");    //Example 是A窗口的标题
    CIPAddressCtrl *m_Address = (CIPAddressCtrl *)::GetDlgItem(hWnd,IDC_IPADDRESS1); //出错而我用CWin::::FindWindow(NULL,"Example");也不行,因为它返回的是CWin*类型,而不是HANDLE句柄。
    高人能给个具体代码么?
      

  3.   

    找到A窗口,接下来继续用FindWindow遍历A的所有子窗口,肯定能找到你要的东西
    如果是特定窗口,还可以更容易些
      

  4.   

    控件:HWND   hWndChild   =   ::GetWindow(hWnd,   GW_CHILD);  
    while(hWndChild)  
    {  
    hWndChild   =   ::GetWindow(hWndChild,   GW_HWNDNEXT);  
      

  5.   

    FindWindow试了不行啊,到底怎么用啊?
      

  6.   

    http://blog.csdn.net/bobob/archive/2006/01/17/581988.aspx
      

  7.   

    先findwindow找到目标控件的句柄,然后sendmessage(hWnd,WM_GETTEXT,文本的存储长度,文本存储地址),也就是把你要获取的东东存放到最后的那个参数里面了
      

  8.   

    还是找找A窗口的对象吧,都在同一程序里,应该好找,并且你都知道了A的一个控件的ID 是 IDC_IPADDRESS1,所以A窗口应该也是在同一个模块里创建跟踪一下,看看在哪里弹出了A
      

  9.   

    GetDlgItem?
    你不是要文本么?
    GetDlgItemtext吧
      

  10.   

    GetDlgItem获取窗口中子控件指针!
      

  11.   

    HWND  hWnd  =  ::FindWindow(NULL,"Example");
    hWnd  =  GetDlgItem(hWnd,IDC_IPADDRESS1);
    CIPAddressCtrl m_Address;
    m_Address.FromHandle(hWnd);
      

  12.   

    同进程内请直接使用资源ID号
    跨进程请使用findchildwindow遍历
      

  13.   

    可以采用消息机制来处理:
    大致如下#define WM_GETIPCTRL  WM_APP + 1class A
    {
    CIPAddressCtrl* m_Address;// 窗口创建时建立控件对应指针, 处理OnCreate()或OnInitDialog()
    int OnCreate(...)
    {
     m_Address=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1); 
    }// 重写OnWndMsg()方法
    BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
       if (message == WM_GETIPCTRL)
       {
          *pResult = (LRESULT*)m_Address;
         return TRUE;
        }
       return __super::OnWndMsg(message,wParam,lParam,pResult);
    }
    };在class b 中处理用FindWindow查找窗口A的窗口,
    然后向窗口发送消息获取控件指针(CIPAddressCtrl) *pCtrl = ::SendMessage(A.窗口句柄,WM_GETIPCTRL,0,0);
      

  14.   

    是 CIPAddressCtrl* pCtrl = (CIPAddressCtrl*)::SendMessage(A.窗口句柄,WM_GETIPCTRL,0,0); 
      

  15.   

    可以用FindWidowEx
      HWND   FindWindowEx(   
          HWND   hwndParent,             //   handle   to   parent   window   
          HWND   hwndChildAfter,     //   handle   to   child   window   
          LPCTSTR   lpszClass,         //   class   name   
          LPCTSTR   lpszWindow         //   window   name   
      );
    /*如果 Parent 是 0, 则函数以桌面窗口为父窗口, 查找桌面窗口的所有子窗口;
    如果  是 HWND_MESSAGE, 函数仅查找所有消息窗口;
    子窗口必须是 Parent 窗口的直接子窗口;
    如果 Child 是 0, 查找从 Parent 的第一个子窗口开始;
    如果 Parent 和 Child 同时是 0, 则函数查找所有的顶层窗口及消息窗口.
    */ 
      

  16.   


    为什么一定要直接找到A窗口,你可以通过一个中间量来中转嘛,如果基于CDialog模式的应用程序,A、B窗口确实关系比较远,可以可以全局的变量保存A窗口的m_hWnd句柄,再给它发送消息,如果是基础SDI或者MDI模式的应用程序,而且、B窗口确实关系比较远,可以使用CMainFrame来中转消息。B发消息给CMainFrame,CMainFrame发送消息给A。