有这么一个问题,大家帮忙想想主意!(300分)

  • 主题发起人 主题发起人 Blabber
  • 开始时间 开始时间
B

Blabber

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个可执行程序,是别人编的。我无法改他的原码!<br>这个应用程序上有两个文本框T1和T2,还有两个按纽B1和B2.我现在有很多数据需要输入T1,并按进行查询B1(快捷键F3).请问怎样将数据传送到T1,并自动进行查询.象按B1一样的效果.<br><br>大家给我出出注意!帮顶也有分哦!:)
 
找到t1,b1的句柄(handle)<br>用setwindowtext设置t1的文字<br>然后向b1发送bn_clicked消息。
 
同意楼上的作法。<br>查询也可向该程序传送F3按键消息
 
能否详细说说如何获取T1、B1的句柄。这是别人的程序,我其实不知道任何有关它的参数。T1、B1什么我只是举例子的。其实就好比我要写一个程序向IE的网址栏输入网址内容,并发送一个“转到”按钮的信息。<br>我不太熟这方面的内容,麻烦解释的详细一些。谢谢!
 
呵呵,新鲜<br>&nbsp; &nbsp; 我也要学习啊
 
我写了一个源程序,是用来在江湖聊天的时候潜水用的,在江湖聊天室久不说话会被驱逐的,我的程序就定时说一句:向聊天室的输入控键发消息,你修改一下也许就适合你用了,比如从数据文件里面读内容。<br><br>程序非常短小,我用作给初学者介绍的入门程序,全部代码如下:<br>program jianghu;<br><br>{$apptype console}<br><br>uses windows,messages;<br><br>function GetFocusHld: hwnd;<br>var<br>&nbsp; &nbsp; windowhld:hwnd;<br>&nbsp; &nbsp; threadld:dword;<br>begin<br>&nbsp; windowhld:=GetForegroundWindow;<br>&nbsp; threadld:=GetWindowThreadProcessId(Windowhld,nil);<br>&nbsp; AttachThreadInput(GetCurrentThreadId,threadld,true);<br>&nbsp; Result:=getfocus;<br>&nbsp; AttachThreadInput(GetCurrentThreadId,threadld,false);<br>end;<br><br>procedure SendKeys(focushld:hwnd;sSend:string);<br>var<br>&nbsp; &nbsp; i:integer;<br>&nbsp; &nbsp; ch: byte;<br>begin<br>&nbsp; if focushld = 0 then Exit;<br>&nbsp; i := 1;<br>&nbsp; while i &lt;= Length(sSend) do<br>&nbsp; begin<br>&nbsp; &nbsp; ch := byte(sSend);<br>&nbsp; &nbsp; if Windows.IsDBCSLeadByte(ch) then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; Inc(i);<br>&nbsp; &nbsp; &nbsp; SendMessage(focushld, WM_IME_CHAR, MakeWord(byte(sSend), ch), 0);<br>&nbsp; &nbsp; end<br>&nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp; SendMessage(focushld, WM_IME_CHAR, word(ch), 0);<br>&nbsp; &nbsp; Inc(i);<br>&nbsp; end;<br>&nbsp; postmessage(focushld,WM_keydown,13,0);<br>end;<br><br>procedure CloseIEPopWind;<br>var<br>&nbsp; hCurrentWindow, hActWind: HWnd;<br>&nbsp; szText: array [0..255] of char;<br>begin<br>&nbsp; hActWind:=FindWindow('Progman',nil);<br>&nbsp; hCurrentWindow := GetWindow(hActWind, GW_HWNDFIRST);<br>&nbsp; while hCurrentWindow &lt;&gt; 0 do<br>&nbsp; begin<br>&nbsp; &nbsp; if (GetWindowText(hCurrentWindow, @szText, 255)&gt;0) and (szText='Microsoft Internet Explorer')<br> then begin <br> &nbsp;//writeln('Found IE Pop Window ',hCurrentWindow, #9, szText);<br> &nbsp;PostMessage(hCurrentWindow,WM_CLOSE,1,0); <br> end;<br>&nbsp; &nbsp; hCurrentWindow:=GetWindow(hCurrentWindow, GW_HWNDNEXT);<br>&nbsp; end;<br>end;<br><br>var<br>&nbsp; s: string;<br>&nbsp; i,n: integer;<br>&nbsp; focushld: hwnd;<br>&nbsp; nosay: boolean;<br>begin<br>&nbsp; n:=0;<br>&nbsp; nosay:=false;<br>&nbsp; if ParamCount&gt;0 then begin<br> val(ParamStr(1),n,i);<br> nosay:=(i=0)and(n=0);<br> if i&lt;&gt;0 then n:=0<br>&nbsp; end;<br>&nbsp; if n=0 then n:=10;<br>&nbsp; writeln('江湖自动泡点程序--杨光彬 2002年5月7日修订版'#13#10);<br>&nbsp; writeln('用法:',ParamStr(0),' [自动重复时间(这次为',n,'秒)]'#13#10);<br>&nbsp; n:=n*1000;<br>&nbsp; if not nosay then begin<br>&nbsp; &nbsp; writeln('请在五秒之内移动到江湖窗口,鼠标点击话语输入框,等待自动说出0'#13#10);<br>&nbsp; &nbsp; sleep(5000);<br>&nbsp; &nbsp; focushld:=getfocushld;<br>&nbsp; &nbsp; write('已经开始自动泡点,按Ctrl+C退出程序。(',focushld,') ... ');<br>&nbsp; end else write('此次仅仅是自动关闭IE弹出窗口,按Ctrl+C退出程序 ... ');<br>&nbsp; i:=0;<br>&nbsp; repeat<br> CloseIEPopWind;<br> if not nosay then begin<br> &nbsp;str(i,s);<br> &nbsp;if i mod (180000 div n)=0 then sendkeys(focushld,'/练武$') else <br> &nbsp;sendkeys(focushld,s);<br> &nbsp;inc(i);<br> end;<br> sleep(n);<br>&nbsp; until false;<br>end.<br>
 
我先研究一下,可能还会有问题请教。谢谢您!
 
Blabber 哇,你不是想做暴力破解的东西吧
 
呵呵,光子的 做法有效<br>&nbsp; &nbsp;学习
 
to delp:不是的,有个数据库查询软件需要一个一个数据输入再查询。效率太低,所以我有了这样的想法:)
 
to Blabber 用 光子 的办法应该可行
 
先研究一下光子的东西
 
可以用钩子函数获取录入控件,用程序将数据录入,后用模拟鼠标事件实现按钮事件。具体钩子函数你可以在DFW里查询。
 
前一段日子一直比较忙。没有进行这一问题的研究。现在使用光子的方法,这个程序确实可以达到我的目标。但是,我在实践过程中碰到了一个问题暂时无法解决。请大家帮忙。<br>情况是这样的:我使用一个窗体,窗体有一个按钮Button1。点击Button1后使用如下语句获取我所需控件(另一程序)的handle号。<br>&nbsp;sleep(5000);<br>&nbsp;focushld:=getfocushld;<br>但我发现,这时focushld值不是我所需那个控件的handle号,而是我这窗体或者窗体上按钮的handle号。因为我这时不能将字符发送过去。但是我如果将sendkey中的focushld换成我用光子程序中测出来的handle的话,是可以将字符发送过去的。<br>我估计现在的问题是,我将焦点移到我所需控件(另一程序)的时候,实际的焦点没有从我原来的窗体移开。我不知怎么才能在使用窗体的情况下,获取另一窗体上控件的handle号。<br>请大家帮帮小弟。谢谢!<br>
 
大家出出主意吧!如果有什么需要进一步了解的,尽管问。小弟先谢谢啦!
 
SAVE &nbsp;AS
 
先用Spy++或者WinSight32之类的查查他的类名和窗口名<br>然后,通过FindWindow获得程序的Handle<br>再通过FindWindowEx获得那个程序里的文本框和按钮的句柄,<br>最后发送消息
 
光子在吗?<br>能把你的代码加些注释吗?有的地方看不太懂。让你见笑了。谢谢
 
偶是来混分的!!!:P<br>首先给你段程序(别急,慢慢来……还有……),<br>把鼠标放在你要查看的控件上,就会得到句柄和类名!<br>以下抄袭至 卷起千堆雪:<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; Label1: TLabel;<br>&nbsp; &nbsp; Label2: TLabel;<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; &nbsp; procedure GetMousePosHwndAndClassName(Sender: TPoint);<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br><br>{$R *.dfm}<br><br>procedure TForm1.GetMousePosHwndAndClassName(Sender: TPoint);<br>var<br>&nbsp; hWnd: THandle;<br>&nbsp; aName: Array[0..255] of Char;<br>begin<br>&nbsp; hWnd := WindowFromPoint(Sender);<br>&nbsp; Label1.Caption := 'Handle : ' + IntToStr(hWnd) + #13;<br><br>&nbsp; if Boolean(GetClassName(hWnd, aName, 256)) then<br>&nbsp; &nbsp; Label2.Caption := 'ClassName : ' + string(aName)<br>&nbsp; else<br>&nbsp; &nbsp; Label2.Caption := 'ClassName : not found';<br>end;<br><br>procedure TForm1.Timer1Timer(Sender: TObject);<br>var<br>&nbsp; rPos: TPoint;<br>begin<br>&nbsp; if Boolean(GetCursorPos(rPos)) then<br>&nbsp; &nbsp; GetMousePosHwndAndClassName(rPos);<br>end;<br><br>end.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部