有一个由多个框架组成的程序A,里面有B框架,B框架下含有窗口C1(好像是CDialog类的子类),C2,其中C1窗口用来输入文字,C2窗口显示用户输入的文本.我有程序X,得到C1中的各窗口句柄,并模拟C1的事件消息来在A中实现自动输入文本.假如C1窗口含有一个EDIT控件,一个发送button"发送",那么,我可以发一个wm_settext消息给edit,然后发送一个wm_command消息给button,那么C2可以正确的显示发送的文本,表示X程序已经起作用.问题来了,假如C1只有一个EDIT控件,那么,应该发送什么消息给什么控件呢?或者给哪个窗口发送什么消息?(注:edit控件中的文字WM_SETTEXT消息已经设置)最好能给我一个简单的例程代码

解决方案 »

  1.   

    你要通过发送消息的方式设置c1中Edit控件的文本内容?GetDlgItem(IDC_EDIT)->SendMessage(WM_SETTEXT,0,发送的文本指针);
      

  2.   

    你要通过发送消息的方式设置c1中Edit控件的文本内容?GetDlgItem(IDC_EDIT)->SendMessage(WM_SETTEXT,0,发送的文本指针);
    请注意看我的提问...有可能偶题的不太明确,现在再强调一下:
    文本设置没问题,问题是怎么发送出去,是一个没有IDOK的对话框程序里面怎么触发类似OnOK()这类的消息处理函数
      

  3.   

    你可以在C1的EN_CHANGE的消息响应函数得到文本发送WM_SETTEXT给另一个文本框
      

  4.   

    回复人: bluebohe(薄荷) (MVP) ( ) 信誉:135  2004-03-28 21:57:00  得分:0 
     
     
      你可以在C1的EN_CHANGE的消息响应函数得到文本发送WM_SETTEXT给另一个文本框
      
     哦...第二点不明确的地方....以上假设是C1以及A程序是未知的不可更改的第三方程序,所有相关参数什么的都是spy++得到,所以在A程序中不考虑消息处理什么的代码修改,仅考虑X程序实现C1窗口的发送edit消息至C2窗口
      

  5.   

    你可以得到,c1的edit的句柄,那么也应该能得到c2的edit的句柄了?如果可以的话,就可以用SetWindowsText() 。你说的明白点,我不太明白你的意思
      

  6.   

    回复人: zhang865(年轻人) ( ) 信誉:102  2004-03-29 11:15:00  得分:0 
     
     
      你可以得到,c1的edit的句柄,那么也应该能得到c2的edit的句柄了?如果可以的话,就可以用SetWindowsText() 。你说的明白点,我不太明白你的意思
      
     
    得到是可以得到,不过C2句柄没什么意义,C2只不过是一个显示窗口
    举例来说,程序A是一个游戏,其中C1是你聊天界面,C2是聊天内容显示窗口,那么C2对我来说没有意义,C1才是我要处理的一个窗口,而C1中假设没有button存在的话,我应该用什么消息告诉C1窗口我已经输入完毕edit,需要OnOK()或者DoModal()乐,就是这么一回事.
      

  7.   

    (首先声明:我是菜鸟(-^_^-))
    根据我的理解应该是先得到往C1的Edit输入的时候会发送什么消息,然后拦截这个消息
    可是我试验了下,还是不知道会发送什么消息……
      

  8.   

    回复人: dlscdn(-^_^-) ( ) 信誉:95 摁....输入的时候是en_change啊什么的消息,还有键盘消息,然后你输入完成后一个回车
    如果是普通的对话框程序,应该会触发一个OnOK(),问题是,这个回车,实际上发送乐什么消息给这个窗口?或者这个回车具体发送乐什么消息,发给乐谁,参数是什么...就是这么回事
      

  9.   

    我知道了
    头文件中加
    // Generated message map functions
    //{{AFX_MSG(CInPut)
    afx_msg void OnChangeEdit();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    原文件中加
    BEGIN_MESSAGE_MAP(CInPut, CDialog)
    //{{AFX_MSG_MAP(CInPut)
    ON_EN_CHANGE(IDC_INPUT, OnChangeEdit)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    void CInPut::OnChangeEdit()
    {
    CString text;
    this->GetDlgItemText(IDC_INPUT,text);
    }只要Edit输入text得到的就是Edit的内容
    剩下的就应该好办了吧
      

  10.   

    在baidu里搜EN_CHANGE搜到的
    自己有试验了一下
     bluebohe(薄荷) (MVP)说的是对的,可我们还不能理解……
      

  11.   

    那就需要知道,C1什么条件下会发这个消息 ,是回车还是 CTRL + S ,你就检测呗,当遇到它的时候就发
      

  12.   

    这个是EDIT控件的EN_CHANGE
    就是这样处理
      

  13.   

    你发送完文本以后再给C1发送一个回车符看看
    c1->SendMessage(WM_KEYDOWN, 0x0d, 0);
      

  14.   

    回复人: zhang865(年轻人) ( ) 信誉:102  2004-03-29 15:36:00  得分:0 
     
     
      那就需要知道,C1什么条件下会发这个消息 ,是回车还是 CTRL + S ,你就检测呗,当遇到它的时候就发
      
     
    晕...偶就是不知道是什么消息才来问,知道乐就不问乐
    回复人: jennifergiant(希罗·尤尔) ( ) 信誉:100  2004-03-29 15:39:00  得分:0 
     
     
      这个是EDIT控件的EN_CHANGE
    就是这样处理
      
     
    照你这么说我应该发什么消息给C1?发一个en_change给edit?回复人: ymbymb() ( ) 信誉:104  2004-03-29 15:41:00  得分:0 
     
     
      你发送完文本以后再给C1发送一个回车符看看
    c1->SendMessage(WM_KEYDOWN, 0x0d, 0);
      
     
    这个是错误的,我试过乐,要是这么简单就不用100分给乐回复人: dlscdn(-^_^-) ( ) 信誉:95  2004-03-29 15:27:00  得分:0 
     
     
      在baidu里搜EN_CHANGE搜到的
    自己有试验了一下
     bluebohe(薄荷) (MVP)说的是对的,可我们还不能理解……
      
     
    把你的试验代码发一个给我看看好么?要是可行的100分就是你和薄荷分乐
      

  15.   

    input.cpp#include "stdafx.h"
    #include "testt.h"
    #include "InPut.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CInPut dialog
    CInPut::CInPut(CWnd* pParent /*=NULL*/)
    : CDialog(CInPut::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CInPut)
    //}}AFX_DATA_INIT
    }
    void CInPut::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CInPut)
    DDX_Control(pDX, IDC_INPUT, m_Input);
    //}}AFX_DATA_MAP
    }
    BEGIN_MESSAGE_MAP(CInPut, CDialog)
    //{{AFX_MSG_MAP(CInPut)
    ON_EN_CHANGE(IDC_INPUT, OnChangeEdit)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CInPut message handlersvoid CInPut::OnChangeEdit()
    {
    CString text;
    this->GetDlgItemText(IDC_INPUT,text);
    GetParent()->GetDlgItem(IDC_EDIT1)->SetWindowText(text);
    //InPut对话框相当于你提到的C1,GetParent()得到C2
    }input.h#if !defined(AFX_INPUT_H__3B4813CA_BF0A_4C3C_9A36_2228F9E2D970__INCLUDED_)
    #define AFX_INPUT_H__3B4813CA_BF0A_4C3C_9A36_2228F9E2D970__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // InPut.h : header file
    ///////////////////////////////////////////////////////////////////////////////
    // CInPut dialogclass CInPut : public CDialog
    {
    // Construction
    public:
    CInPut(CWnd* pParent = NULL);   // standard constructor// Dialog Data
    //{{AFX_DATA(CInPut)
    enum { IDD = IDD_DIALOG1 };
    CEdit m_Input;
    //}}AFX_DATA
    // Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CInPut)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL// Implementation
    protected: // Generated message map functions
    //{{AFX_MSG(CInPut)
    afx_msg void OnChangeEdit();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };//{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_INPUT_H__3B4813CA_BF0A_4C3C_9A36_2228F9E2D970__INCLUDED_)
      

  16.   

    回复人: dlscdn(-^_^-) ( ) 信誉:95  2004-03-29 16:02:00  得分:0 
    你这是修改乐A程序的代码吧?
    但是A程序对我来说是未知的,我知道的仅仅是有这么一个edit控件在C1
    我要的是不修改A程序代码,用X代码实现A程序的C1窗口的Edit提交
      

  17.   

    回复人: ericvan(骨灰虫) ( ) 信誉:100  2004-03-29 16:20:00  得分:0 
     
     
      这么说吧,楼主想控制一个第三方的程序发送消息,在那个第三方的应用程序中,按回车即可发送消息,现在楼主尝试了给它发送回车键,但是没有用,还有没有其他办法?如果楼主的测试无误的话,我是想不出来了。
      
     
    摁....以上理解正确..可能偶测试有问题夜不一定,所以哪位可以成功做到的不妨贴代码或者发代码给我信箱都可,只要做到的一定给分
      

  18.   

    keybd_event( VK_RETURN,0, WM_KEYDOWN , 0 );
      

  19.   

    回复人: ericvan(骨灰虫) ( ) 信誉:100  2004-03-29 17:24:00  得分:0 
     
     
      keybd_event( VK_RETURN,0, WM_KEYDOWN , 0 );  
     
    这个是可以的,不过我要求后台运行的,这样的是要求focus到这个控件才行...
    还有其他答案么?偶急啊~~