现在遇到一个比较棘手的问题我通过VC开发程序,调用一个外部的其他程序的接口,他会弹出一个登录窗口。我想通过VC去实现一个功能,就是通过VC获得这个弹出的登录的窗口,在用户名的Edit中填写默认的用户名我不知道原有的程序接口是通过什么实现的,不知道该如何实现这个功能,希望各位高手帮忙出谋划策,谢谢

解决方案 »

  1.   

    如果接口是在动态链接库中, 需要include其转出函数或类的头文件, 并且需要链接.lib(通常,第三方链接库有一个转入链接库,以.lib为扩展名).
    如果接口是基于COM组件, 在程序中需要先进行CoInitailize初始化COM,然后, 用CoCreateInstance创建这个组件并得到接口的调用指针, 当然,
    仍然需要包含相关函数或类的转出头文件.
      

  2.   

    SendMessage/PostMessage WM_SETTEXT
      

  3.   

    它毕竟是一个窗口
    FindWindow能找到吗?
      

  4.   


    FindWindow?
    可是这个需要两个参数,这两个参数的值怎么获得呀?
      

  5.   

    可以通过EnumWindow或FindWindow找一下这个Edit-box,通常,标准 的Windows CEdit控件, 有固定的ClassName
      

  6.   

    用Spy++查查那个登录窗口的类名(或者知道窗口名)
    先用FindWindow打到登录窗口的名柄,然后枚举登录窗口中的子窗口,查找用户名的文本框。
    找到后SetWindowText
      

  7.   

    FindWindow取得弹窗的句柄然后再用Edit发送设置字符的WM_SETTEXT消息,设置用户名,密码也一样。
      

  8.   

    VC附带了一个工具叫Spy++,利用这个工具可以查出窗口和控件的类名、ID、窗口之间的关系。
    用FindWindow可以根据类名或者标题文字来查找窗口;用FindWindowEx利用窗口之间的关系、类名、文字来查找子窗口和控件;也可以用GetDlgItem根据ID来查找控件。向控件发WM_SETTEXT消息可以改变控件文字。
      

  9.   

    用FindWindow()函数可以根据窗口名找到窗口,然后向找到的窗口发消息WM_SETTEXT来设置用户.
      

  10.   

    EnumChildWindows 枚举字窗口
    GetClassName 获取窗口类名,判断是否"Edit"
      

  11.   

    枚举子窗口,查找用户名文本框
    WM_SETTEXT改变内容
      

  12.   

    也可以通过进程查找所有字窗口,这个方法很通用。你试试。我曾经用findwindowex,findwindow编过一个程序,方法可行。
      

  13.   

    谢谢给为高手的帮助,问题已经解决了,解决方法如下(共出现同样问题的人参考):首先通过spy++,查到窗体的类名,title和其下的控件例如类名为A,title为B然后就可以写程序啦
    //首先写一个回调,用于获得窗体中的控件
    BOOL CALLBACK EnumChildProc(HWND hwndChild,LPARAM lParam)
    {
    TCHAR szClassName[1024];  //ClassName 用于通过句柄获得类名称
    GetClassName(hwndChild,szClassName,1024);  //GetClassName方法,用于通过句柄获得ClassName
    CString str = CString(szClassName); //这个不用说了,就是把TCHART转化成CString,我不知道怎么比较TCHAR,有点笨,所以干脆转化成CString

    if (str == "Edit")   //找到Edit控件,可能在其他程序中应用的话,不是Edit,这个类名称可以在spy++中查到(还真是不错的工具)
    {
                    //由于需要查找的窗体上有两个Edit,为了区分,我写了这个判断,正好我需要填写的那个Edit是没有下一个空间的向,所以我就直接判断下一个控件为空,如果在其他地方应用,还要灵活处理。
    if (GetNextWindow(hwndChild,GW_HWNDNEXT) == NULL)
    {
                            //发送WM_SETTEXT消息,将值填入Edit
    SendMessage(hwndChild,WM_SETTEXT, 0,(LPARAM)("user"));
    }

    } return TRUE;
    }//这个是我写的一个窗体的按钮事件函数
    void COpeaWindowDlg::OnGetWindow() 
    {
            //首先使用FindWindow方法获得窗体,前面说过了,A是类名称,B是title
    CWnd* STWnd =FindWindow(A,B);
    HWND hStWnd = STWnd->m_hWnd;        //枚举获得子控件,hStWnd是上面获得窗体,EnumChildProc是定义的回调函数(貌似这里很类似函数指针,我是这么理解的),第三个参数我也不知道是什么,就随便写了个NULL
    EnumChildWindows(hStWnd,EnumChildProc,NULL);
    UpdateData(TRUE);//更新资源,嘻嘻
    }就如上面的方法,我把用户名填到了,相应窗口的用户名Edit中啦谢谢各位高手指教,加分谢大家结贴~嘻嘻