100分请高手留步__问题关键字:外部程序、句柄、类标示。(100分)

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

stonegyy

Unregistered / Unconfirmed
GUEST, unregistred user!
我想操作一外部程序的文本输入框,有以下条件需要注意:<br>&nbsp; &nbsp; &nbsp; 1、外部程序是用pb写的。<br>&nbsp; &nbsp; &nbsp; 2、该外部程序上有许多文本输入框。<br>&nbsp; &nbsp; &nbsp; 3、该外部程序上有许多文本输入框是空的。<br>&nbsp; &nbsp; &nbsp; 4、只能操作其中一个文本输入框。<br>&nbsp; &nbsp;我已经写了一个操作外部程序的程序,但是她不满足上述条件,请高手指教!!email:[?]
代码:
[?][?][?]xjue_root@163.com<br><br>附源码如下:<br>unit Unit1;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br>&nbsp; Dialogs, StdCtrls, ExtCtrls;<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; Timer1: TTimer;<br>&nbsp; &nbsp; Edit1: TEdit;<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; Button2: TButton;<br>&nbsp; &nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; &nbsp; procedure Button2Click(Sender: TObject);<br>&nbsp; &nbsp; procedure FormCreate(Sender: TObject);<br>&nbsp; &nbsp; procedure Timer1Timer(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br><br>{$R *.dfm}<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>timer1.Enabled:=true;<br>end;<br><br>procedure TForm1.Button2Click(Sender: TObject);<br>begin<br>timer1.Enabled:=false;<br>end;<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br>timer1.Enabled:=false;<br>end;<br><br>procedure TForm1.Timer1Timer(Sender: TObject);<br>var<br>&nbsp;H:HWND;<br>&nbsp;p:TPoint;<br>begin<br>&nbsp; GetcursorPos(P);<br>&nbsp; H:=WindowFromPoint(P);<br>&nbsp; //////////////////////////////////////<br>&nbsp; //此处判断该句柄是否是Tedit的句柄 and &nbsp;是否是特定文本框的句柄<br>&nbsp; //////////////////////////////////////<br>&nbsp; SendMessage(H,WM_SETTEXT,0,Integer(edit1.Text));<br>end;<br><br>end.<br>
 
操作其中哪一个?条件是什么?需要什么样的操作?<br>这些你都没说,别人怎么回答啊:(<br>
 
&nbsp; &nbsp; 对不起,beta,我要往其中一个文本框内输入字符,还要从另一个文本框内读字符,<br>原程序是老学究写的(源程序不可能得到!),我需要些个插件。[?]
 
就是说那个窗口已经定下来了,那就好办了。<br>很显然你可以知道某个你需要操作的输入框在窗口中的位置,那么:<br>1.枚举该窗口中所有的子窗口(GetWindow),若其为一个编辑框那么<br>2.取其位置(GetWindowRect),判断是否你需要操作的编辑框,若是,那么<br>3.通过 SetWindowText 往上写字符串,GetWindowText 取其内容<br>
 
注意,本论坛在添加注释(跟贴)的按钮的下面有一个附加功能:“将此问题提前”<br>这个功能非常有用,点一下,你的帖子就提到第一位了。<br>这几天你经常提前它,相信很快就能得到解决:)<br>
 
[?]var<br>&nbsp;H:HWND;<br>&nbsp;p:TPoint;<br>&nbsp;Trect1,Trect11:Trect;<br>&nbsp;i: longbool;<br>begin<br>&nbsp; GetcursorPos(P);//获得鼠标所指的类指针<br>&nbsp; H:=WindowFromPoint(P);//获得鼠标所指类句柄<br>&nbsp; Trect11.Left:=0;//<br>&nbsp; Trect11.Top:=45;// &nbsp; &nbsp;<br>&nbsp; Trect11.Right:=75;//<br>&nbsp; Trect11.Bottom:=65;//将我想控制的文本框的RECT负值给TRECT类<br>&nbsp; GetWindowRect(h,Trect1 );//获得鼠标所指窗口的RECT<br>//以下是判断鼠标所知是否是我想控制的文本框<br>if (Trect1.left=Trect11.Left) &nbsp;and (Trect1.Right=Trect11.Right) and (Trect1.Top=Trect11.Top) and (Trect1.Bottom=Trect11.Bottom) then <br>&nbsp; &nbsp; &nbsp;SendMessage(H,WM_SETTEXT,0,Integer(edit1.Text));//如果是则将EDIT1的文本写入其中。<br>end;<br>&nbsp; 以上用那些地方错了?
 
先找到主窗口,然后在Enum子窗口, 找到句柄,通过消息sendmessage就很容易控制了,<br>
 
楼主:<br>&nbsp; 你找我我还得现写程序,你找无忌吧,他有现成的.
 
如果你做的程序是在另一个进程中运行,在NT/2000/XP下发WM_SETTEXT消息是不能成功的!
 
&nbsp;我的程序是在98下运行的!<br>
 
stonegyy:<br>老兄,还没解决吗?你要实现什么功能呀?是不是就是你用自己写的Delphi程序向别人用<br>PowerBuilder写的程序的某个编辑框中写入文字呀?你上面的代码不是可以实现吗?<br>我觉得这样就行了,就是鼠标直接指向那个要写入文字的编辑框。<br>&nbsp;[?]var<br>&nbsp;H:HWND;<br>&nbsp;p:TPoint;<br>// Trect1,Trect11:Trect;<br>&nbsp;i: longbool;<br>begin<br>&nbsp; GetcursorPos(P);//获得鼠标所指的类指针<br>&nbsp; H:=WindowFromPoint(P);//获得鼠标所指类句柄<br>// &nbsp;Trect11.Left:=0;//<br>// &nbsp;Trect11.Top:=45;// &nbsp; &nbsp;<br>// &nbsp;Trect11.Right:=75;//<br>// &nbsp;Trect11.Bottom:=65;//将我想控制的文本框的RECT负值给TRECT类<br>// &nbsp;GetWindowRect(h,Trect1 );//获得鼠标所指窗口的RECT<br>//以下是判断鼠标所知是否是我想控制的文本框<br>//if (Trect1.left=Trect11.Left) &nbsp;and (Trect1.Right=Trect11.Right) and (Trect1.Top=Trect11.Top) and (Trect1.Bottom=Trect11.Bottom) then <br>&nbsp; &nbsp; &nbsp;SendMessage(H,WM_SETTEXT,0,Integer(edit1.Text));//如果是则将EDIT1的文本写入其中。<br>end;<br>&nbsp;
 
张无忌的方法也行。<br>你要先做个试验的程序,就是先遍历当前进程,找到PB程序的句柄,再枚举自窗口,一一和<br>TEdit比较,一一向找到的编辑框上写入东西,如果确定某一个就是你要写入问题的编辑框时,<br>将它的位置记下来。<br>在正式的程序中,重复上述过程,只是枚举编辑框时,用上面记下来的位置比较一下,发送<br>就行了。
 
先用Spy++看一下窗口的特征,可以根据窗口的类名,ID,还有位置特征来分辨窗口<br>只要它是个窗口,就好办,否则,没门儿
 
用EnumChildWindow函数来找子窗口,找到一个后判断类名,再就可以控制他了
 
说明白你的问题出在哪!!!
 
这种问题要高手回答,算了,偶不是高手,偶保持沉默。
 
你的代码<br>if (Trect1.left=Trect11.Left) &nbsp;and (Trect1.Right=Trect11.Right) and (Trect1.Top=Trect11.Top) and (Trect1.Bottom=Trect11.Bottom) then <br>&nbsp; &nbsp; &nbsp;SendMessage(H,WM_SETTEXT,0,Integer(edit1.Text));//如果是则将EDIT1的文本写入其中。<br>end;<br>改为:<br>控件的 If &nbsp;( Trect1.Left = Edit1.Left + Form1.Left + 4 ) and ( Trect1.Top = Edit1.Top + Form1.Top + 23 ) &nbsp;Then .....<br>&nbsp; &nbsp;<br>这样就OK了,如果,怕没有判断 Height 和 Right 不准确,那你就用同样的方法来来断断就可以了<br>记得可以要,别忘了给我加分哦,呵呵。。。。 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
 
后退
顶部