有一个由多个框架组成的程序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消息已经设置)最好能给我一个简单的例程代码
请注意看我的提问...有可能偶题的不太明确,现在再强调一下:
文本设置没问题,问题是怎么发送出去,是一个没有IDOK的对话框程序里面怎么触发类似OnOK()这类的消息处理函数
你可以在C1的EN_CHANGE的消息响应函数得到文本发送WM_SETTEXT给另一个文本框
哦...第二点不明确的地方....以上假设是C1以及A程序是未知的不可更改的第三方程序,所有相关参数什么的都是spy++得到,所以在A程序中不考虑消息处理什么的代码修改,仅考虑X程序实现C1窗口的发送edit消息至C2窗口
你可以得到,c1的edit的句柄,那么也应该能得到c2的edit的句柄了?如果可以的话,就可以用SetWindowsText() 。你说的明白点,我不太明白你的意思
得到是可以得到,不过C2句柄没什么意义,C2只不过是一个显示窗口
举例来说,程序A是一个游戏,其中C1是你聊天界面,C2是聊天内容显示窗口,那么C2对我来说没有意义,C1才是我要处理的一个窗口,而C1中假设没有button存在的话,我应该用什么消息告诉C1窗口我已经输入完毕edit,需要OnOK()或者DoModal()乐,就是这么一回事.
根据我的理解应该是先得到往C1的Edit输入的时候会发送什么消息,然后拦截这个消息
可是我试验了下,还是不知道会发送什么消息……
如果是普通的对话框程序,应该会触发一个OnOK(),问题是,这个回车,实际上发送乐什么消息给这个窗口?或者这个回车具体发送乐什么消息,发给乐谁,参数是什么...就是这么回事
头文件中加
// 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的内容
剩下的就应该好办了吧
自己有试验了一下
bluebohe(薄荷) (MVP)说的是对的,可我们还不能理解……
就是这样处理
c1->SendMessage(WM_KEYDOWN, 0x0d, 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分就是你和薄荷分乐
#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_)
你这是修改乐A程序的代码吧?
但是A程序对我来说是未知的,我知道的仅仅是有这么一个edit控件在C1
我要的是不修改A程序代码,用X代码实现A程序的C1窗口的Edit提交
这么说吧,楼主想控制一个第三方的程序发送消息,在那个第三方的应用程序中,按回车即可发送消息,现在楼主尝试了给它发送回车键,但是没有用,还有没有其他办法?如果楼主的测试无误的话,我是想不出来了。
摁....以上理解正确..可能偶测试有问题夜不一定,所以哪位可以成功做到的不妨贴代码或者发代码给我信箱都可,只要做到的一定给分
keybd_event( VK_RETURN,0, WM_KEYDOWN , 0 );
这个是可以的,不过我要求后台运行的,这样的是要求focus到这个控件才行...
还有其他答案么?偶急啊~~