请问我获得某一窗口的句柄后如何与之互送内容 ( 积分: 80 )

  • 主题发起人 主题发起人 siso
  • 开始时间 开始时间
S

siso

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个窗口界面(假设标题为&quot;商品档案&quot;)的功能如下:<br>有几个文本框 分别是: 原价 价格1 价格2 价格3 价格4 &nbsp;(假设分别为edit1-5)<br>其中的原价是早已录入的商品价格 而价格1-4是供手工输入的不同折扣的价格<br><br>我想用Delphi 写一自动计算百分率的软件,单击button1时从&quot;商品档案&quot;窗口取出&quot;原价&quot;文本框中的内容,填入我的软件的“原价”文本框(假设edit1),然后按“计算”按钮时(button2)时分别计算出各百分率,然后填入edit2-edit4中。然后单击“发送”(button3)时把edit2-edit4的内容自动填入件即(商品档案)窗口对应的价格1-价格4文本框中(即edit2-edit4)。
 
有一个窗口界面(假设标题为&quot;商品档案&quot;)的功能如下:<br>有几个文本框 分别是: 原价 价格1 价格2 价格3 价格4 &nbsp;(假设分别为edit1-5)<br>其中的原价是早已录入的商品价格 而价格1-4是供手工输入的不同折扣的价格<br><br>我想用Delphi 写一自动计算百分率的软件,单击button1时从&quot;商品档案&quot;窗口取出&quot;原价&quot;文本框中的内容,填入我的软件的“原价”文本框(假设edit1),然后按“计算”按钮时(button2)时分别计算出各百分率,然后填入edit2-edit4中。然后单击“发送”(button3)时把edit2-edit4的内容自动填入件即(商品档案)窗口对应的价格1-价格4文本框中(即edit2-edit4)。
 
我在网上搜索了半天只得到发送的代码<br>var hw:hWnd;<br>begin<br>hw:= findwindow(nil,'商品档案');<br>if hw&lt;&gt;0 then begin<br>hw:=findwindowex(hw,0,'Tedit','edit1');<br>sendmessage(hw,wm_settext,0,longint(pchar('test')));<br>end;<br>end;<br>可是1.我试后发现商品档案窗口中的edit1的text必须也是edit1才能实现,否则就不能成功。而且如果edit1放在PageControl控件中也不能成功。<br>2.如何得到“商品档案”窗口中的内容,例如要得到“商品档案”的edit1的文本<br>请问如何实现发送与得到“商品档案”中edit的内容,我对消息方面不太清楚,麻烦说仔细一点。谢了!
 
这两个窗口是你自己程序中的,还是另一个应用程序中的?
 
function EnumChildProc(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;<br>var<br>wtext: Array[0..255] of Char;<br>begin<br> &nbsp;Getwindowtext(hwnd, @wtext, 255);<br> &nbsp;if SameText(wtext, 'edit1') then &nbsp;//找到指定文本框的句柄<br> &nbsp;begin<br> &nbsp; &nbsp; showmessage(wtext);<br> &nbsp; &nbsp; wtext:='新内容';<br> &nbsp; &nbsp; setwindowtext(hwnd,wtext); //设置文本框内容<br> &nbsp;end;<br> &nbsp;Result := True;<br>end;<br><br>procedure TForm1.Button2Click(Sender: TObject);<br>var<br> &nbsp;whandle:hwnd;<br>begin<br> &nbsp;whandle:=findwindow(nil,'商品档案'); //主窗口窗体的标题<br> &nbsp;if whandle=0 then<br> &nbsp; &nbsp;showmessage('window not find')<br> &nbsp;else<br> &nbsp; &nbsp;EnumChildWindows(whandle,@EnumChildProc,0);<br>end;
 
有一点我就不明白了程序之间传递数据为什么要用消息?<br>是不是很逗!#%·
 
“百分率计算&quot;是delphi的,&quot;商品档案&quot;是另一个程序(财务软件)的。<br>但由于是试验,所以“商品档案&quot;我也是用delphi做的
 
to :迷糊大哥<br>我试了,在百分率计算中点击后弹出信息edit1,但再点击就什么也没有,而且我修改了&quot;商品档案&quot;edit1中的内容击,仍然只是弹出信息edit1
 
to:老人家<br>那么请问用什么方法较好?
 
To siso,<br>我的QQ:82780254<br>你引用其他单元就可以访问其他单元上的控件和数据
 
var hw:hWnd;<br>begin<br>hw:= findwindow(nil,'商品档案');<br>if hw&lt;&gt;0 then begin<br>hw:=findwindowex(hw,0,PChar('TEdit'),nil);<br>sendmessage(hw,wm_settext,0,longint(pchar('test')));<br>end;<br>end;<br>说两点,第一 FindWindow的参数是大小写敏感的,所以应该是TEdit,后面那个可以是空的,那样就是找到最开始的一个,你可以自己测试,测完了就知道哪个是哪个了,<br>2/前后两个参数只有一个是必须的,两个一起就限定比较准确一些<br>------------------------<br>而且如果edit1放在PageControl控件中也不能成功。<br>那是因为edit1的父窗口变成PageControl了,所以你要先找到PageControl,才能用FindWindowEx去找句柄<br>------------------------<br>最简单的办法是用spy去查看各个edit的对应值,然后直接用findwindowEx去取就行了<br>------------------------<br>迷糊的办法应该可以,如果还有问题留下QQ(老人家的方法[:)])
 
你又没得到输入“原价”用的编辑框,怎么能取到数据呢?<br><br>你怎么知道输入“原价”用的编辑框的名字叫:Edit1? &nbsp; &nbsp;不是想当然么!
 
to:wk_knife<br>我由于是试验的,所以用delphi做的一个&quot;商品档案&quot;的窗口,所以知道“原价”对应的是edit1
 
to :chenybin大哥<br>谢谢您的详细解答!<br>只是<br>var hw:hWnd;<br>begin<br>hw:= findwindow(nil,'商品档案');<br>if hw&lt;&gt;0 then begin<br>hw:=findwindowex(hw,0,PChar('TEdit'),nil);<br>sendmessage(hw,wm_settext,0,longint(pchar('test')));<br>end;<br>end;<br>其中我在商品档案放了edit1与edit2,并删除两edit的text内容<br>结果运行后,却是在edit2中填入test<br>这点与您说的:后面那个可以是空的,那样就是找到最开始的一个有点不符<br>我用spy++查看 两edit分别是<br>001F021E '' TEdit 可见<br>001C0236 '' TEdit 可见<br>请问该如何使用。还有如何进行接收“商品档案”窗口的内容到我的程序中。谢谢!<br>至于迷糊大哥的方法我试了还是不行。
 
KeyLife富翁笔记 &nbsp;<br>作者?: chenybin<br>标题?: 获得两个相同类控件 <br>关键字: 类 相同 控件 获得 Edit <br>分类?: 个人专区 <br>密级?: 私有 <br>(评分: , 回复: 0, 阅读: 3) &amp;raquo;&amp;raquo; <br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> &nbsp; &nbsp;ParentHandle , ChindHanlde : THandle;<br> &nbsp; &nbsp;I : Integer;<br>begin<br> &nbsp; &nbsp;ParentHandle := FindWindow(nil, PChar('Form1'));// [blue]另外一个程序的标题,我在那个程序里面放了10个Edit框[/blue]<br> &nbsp; &nbsp;I := 0;<br> &nbsp; &nbsp;if ParentHandle &lt;&gt; 0 then begin<br> &nbsp; &nbsp; &nbsp; &nbsp;// 先找到第一个控件<br> &nbsp; &nbsp; &nbsp; &nbsp;ChindHanlde := FindWindowEx(ParentHandle, 0, PChar('TEdit'), nil);<br> &nbsp; &nbsp; &nbsp; // 循环找<br> &nbsp; &nbsp; &nbsp; &nbsp;while ChindHanlde &lt;&gt; 0 do begin<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SendMessage(ChindHanlde, WM_SETTEXT, 0, Integer(pchar(IntToStr(I))));// [blue]设置内容,好像这里的Integer也比较重要[/blue]<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ChindHanlde := FindWindowEx(ParentHandle, ChindHanlde, PChar('TEdit'), nil);// [blue]寻找下一个Edit,注意FindWindowEx的地二个参数,是ChindHandle[/blue]<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Inc(I);<br> &nbsp; &nbsp; &nbsp; &nbsp;end;<br> &nbsp; &nbsp;end;<br>end; <br> ---------------------<br>请问该如何使用。还有如何进行接收“商品档案”窗口的内容到我的程序中。谢谢!<br>------------------------<br>接收他的内容其实一部分是是他发送的事,他不发送你自己去取就按迷糊上面的写法,关键找到它的句柄,然后是WM_GETTEXT,设置后面的参数,道理是一样的
 
多人接受答案了。
 
后退
顶部