用SendMessage向Edit控件发送数据(100分)

  • 主题发起人 主题发起人 netfun2000
  • 开始时间 开始时间
N

netfun2000

Unregistered / Unconfirmed
GUEST, unregistred user!
别说论坛有了,是有例子了。可我怎么也调不同我这个。<br>我这里有一个程序A,在他的TabSheet3中有一个Name为txtMessage的Edit,并且还有个Send按纽。<br>我想再写一个程序B,向程序A中的TabSheet3中的那个名为txtMessage的Edit发送数据,并触发那个Send。<br>我用以下方式做,但不成功:<br>hWnd_A:=FindWindow(nil,'程序A');<br>EnumChildWindows(hWnd_A, @CalBack, 0); ====&gt;http://www.delphibbs.com/delphibbs/dispq.asp?lid=2427839<br>那个CalBack如下修改:<br>1、声明回调函数,function CalBack(aa: Hwnd; bb: LPARAM): Boolean; stdcall;<br>&nbsp; function CalBack(aa: Hwnd; bb: LPARAM): Hwnd; stdcall;<br>&nbsp; var<br>&nbsp; &nbsp; aClassName, ComponetName: array[0.255] of Char;<br>&nbsp; begin<br>&nbsp; &nbsp; Result := 0;<br>&nbsp; &nbsp; GetClassName(aa, aClassName, 255); &nbsp; &nbsp; &nbsp;// 得到控件类名<br>&nbsp; &nbsp; GetWindowText(aa, ComponetName, 255); &nbsp; // 得到控件标题<br>&nbsp; &nbsp; <br>&nbsp; &nbsp; // 根据标题判断是不是你要找的Edit<br>&nbsp; &nbsp; if (StrComp(aClassName, PChar('TEdit')) = 0) and (aa &lt;&gt; 0) then<br>&nbsp; &nbsp; &nbsp; if (StrComp(ComponetName, PChar('txtMessage'))=0 then<br>&nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; Result := aa;<br>&nbsp; &nbsp; &nbsp; &nbsp; ShowMessage('找到了!');<br>&nbsp; &nbsp; &nbsp; end;<br>&nbsp; end;<br><br><br>&nbsp; &nbsp;<br>
 
老兄好像引用的我的帖子,<br>请检查:<br>1、你Findwindows的句柄是否正确<br>2、你是否注册了callback,(可以这样验证,在callback中设置断点,如果程序运行起来,断点没有激活,则未注册)
 
To qince:<br>1.通过FindWindow我确实找到了那个正在运行这个的程序的句柄,这个我已经验证.<br>2.是否注册了callback,我就不知道了.因为我是刚学的,不知道如何"在callback中设置断点".<br><br>还请多多指教.<br><br>谢谢.<br>
 
各位老大:<br>我现在将那个"程序A"修改为MDI方式,其中有一个名为"TestA"的子窗口,其中有一个名为txtMessage的Edit和一个Button名为Send,我怎样找到那个"TestA"窗口的句柄,并从另一个程序中发送数据到"TestA"中的那个Edit中,并触发Send?<br><br>谢谢.<br>
 
找到控件的句柄才能向它发消息
 
就是在function CalBack(aa: Hwnd; bb: LPARAM): Hwnd; stdcall;函数中设置断点。
 
To qince:<br>那个 CalBack 没有运行,请问怎样解决?<br>
 
&nbsp;{ find the exist game window }<br>&nbsp; HWndRuningApp := FindWindow(nil, PChar('VCD转换成为MPEG'));<br>&nbsp; if HWndRuningApp &lt;&gt; 0 then<br>&nbsp; begin<br>&nbsp; &nbsp; EnumChildWindows(HWndRuningApp, @CalBack, 0); &nbsp; // 一定要执行这步,最好在TIMER中执行<br>&nbsp; &nbsp; SetActiveWindow(HWndRuningApp);<br>&nbsp; end;
 
再请教Qince:<br>&nbsp;function CalBack(aa: Hwnd; bb: LPARAM): Hwnd; stdcall;<br>&nbsp;var<br>&nbsp; &nbsp;aClassName, ComponetName: array[0..255] of Char;<br>&nbsp;begin<br>&nbsp; &nbsp;Result := 0;<br>&nbsp; &nbsp;GetClassName(aa, aClassName, 255); &nbsp; &nbsp; &nbsp;// 得到控件类名<br>&nbsp; &nbsp;GetWindowText(aa, ComponetName, 255); &nbsp; // 得到控件标题<br>&nbsp; &nbsp;showmessage(aClassName);<br>&nbsp; &nbsp;showmessage(ComponetName);<br>&nbsp; &nbsp;// 根据标题判断是不是你要找的Edit<br>&nbsp; &nbsp;if (StrComp(aClassName, PChar('TEdit')) = 0) and (aa &lt;&gt; 0) then<br>&nbsp; &nbsp; &nbsp;if (StrComp(ComponetName, PChar('txtMessage'))=0) then<br>&nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; &nbsp;Result := aa;<br>&nbsp; &nbsp; &nbsp; &nbsp;ShowMessage('找到了!');<br>&nbsp; &nbsp; &nbsp;end;<br>&nbsp;end;<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp;hWnd_TestA:hwnd;<br>begin<br>&nbsp;hWnd_TestA:=FindWindow(nil, PChar('TestA'));<br>&nbsp;if hWnd_TestA &lt;&gt; 0 then<br>&nbsp; &nbsp;EnumChildWindows(HWnd_TestA, @CalBack, 0);<br>end;<br><br>我这里的TestA是MDI程序,我在CalBack中得到的aClassName和ComponetName是主MDI里的东西,我要的是子MDI(窗口名称为Child_TestA)中TEdit的Edit(txtMessage)的句柄,可我得不到,请问如何取得?<br><br>谢谢.<br>
 
那你就要先得到子窗口的HANDLE
 
首先,谢谢qince的热情解答.<br>1.如何得到子窗口的Handle?<br>2.我用句柄查看程序得到如下结果:(原来那个程序中我要的到不是TEdit而是TRichEdit)<br>类:TRichEdit<br>1级父类:TfrmChat<br>2级父类:MDIClient<br>3级父类:TfrmMain<br><br>我们以前得到那个句柄,其实就是TfrmMain的句柄.<br>现在,请问,如何得到TfrmChat的句柄并向那个TRichEdit发送文字?<br><br>谢谢.<br>
 
还真没抓过 MDI 的 控件句柄<br>qince@163.com<br>可以将您的CODE的 函数 和您的 MDI 运行程序发给我,帮您看看:)
 
收到了吗?<br>
 
收到了,不过运行的时候,报错:AV
 
我在Windows2000和Windows XP上运行均无上述问题.<br>刚才,我又检查了一次,在我这里可以运行.请帮忙再看看.<br><br>谢谢.<br>
 
↑一下。<br>
 

Similar threads

后退
顶部