如何获得客户程序窗口中某一部件(如Edit)的Handle?注:客户程序窗口中同一部件类有多个(如Edit在不同位置有多个)。 (200分)

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

newnob

Unregistered / Unconfirmed
GUEST, unregistred user!
[:)]Form_handle:=FindWindow(nil,pchar(p_name));<br>GetClassName(Form_handle,WindowClass,255);<br>在当客户程序窗口中WindowClass有多个相同的派生时,无法确定。<br>即当一个客户程序窗口中有多个Edit时,无法确定要的是哪一个Edit。<br><br>Handle := WindowFromPoint(Pos);<br>也许可以通过此,获得具体Edit的Handle。那么我如何来确定这个Edit在显示时的位置呢?<br>当然客户程序窗口是固定的。那么也许可以利用这个Edit在窗口中的位置,及窗口在屏幕的位置来确定Pos。<br><br>哎。谁能告诉我,怎么知道这个Edit在固定的客户程序窗口中的位置,及窗口在屏幕的位置。<br>我的分就给谁吧。 &nbsp;200大洋。
 
到底是要什么?<br><br>1。如何获得客户程序窗口中某一部件(如Edit)的Handle?<br>2。当一个客户程序窗口中有多个Edit时,无法确定要的是哪一个Edit。(这句话这么也看不懂)<br>3。怎么知道这个Edit在固定的客户程序窗口中的位置,及窗口在屏幕的位置。<br><br>说具体一点,大家也好回答呀。[:D]<br>
 
对每一个Edit都注册它的Handle(存在一个数组中),如果要Sendmessage的时候可<br>以通过查找存Edit的Handle的数组来决定Send给哪个Edit
 
[:)]To savenight<br>1。如何获得客户程序窗口中某一部件(如Edit)的Handle?<br>意思是 &nbsp;如何获得一个别的在正执行的程序的窗口中某一部件(如Edit)的Handle?<br><br>2。当一个客户程序窗口中有多个Edit时,无法确定要的是哪一个Edit。<br>意思是 用GetClassName(Form_handle,WindowClass,255);语句时,得到的只是一个类名,<br>不是部件名,当窗口中有多个派生时,仍无法获得想要的部件的Handle 。<br><br>3。怎么知道这个Edit在固定的客户程序窗口中的位置,及窗口在屏幕的位置。<br>意思是 用什么函数能知道别的程序中一个部件在窗口中的位置。及此窗口在屏幕的位置。<br>这样我就能利用已知的部件在窗口中的位置来,确定每次该程序在执行时该部件在屏幕的位置。<br>从而用Handle := WindowFromPoint(Pos);获得该部件的Handle。<br><br>这个应该不难的。不过我还是想送分了。<br><br><br><br>
 
[:)]to mikegong<br>好方法,可是在程序中如何来做呢?<br><br>还有每次客户程序执行时,用此方法获得的数组中的每一个的变量对应的部件是不是每次都一样呢?<br>例如数组中第五个变量是不是每次都对应于客户程序窗口中同一个部件?<br>值得一提的是在窗口中如果还有一个列表框,而列表框可能在每次程序执行时列项可能有多有少。<br>这个时候此数组中元素还是固定对应于窗口中的部件吗?<br><br>如果此方法真的可行,那我就送200分。不行也送50分。谢谢mikegong。<br>
 
首先你應該指明你要找的Edit與別的Edit不同,有什么特別之處,<br>這樣才能想法知道其句柄,否則一個窗體上有太多的Edit,誰知道<br>你要的是哪一個。
 
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)<br>If IsDragging = True Then<br>&nbsp; &nbsp; Dim rtn As Long, curwnd As Long<br>&nbsp; &nbsp; Dim tempstr As String<br>&nbsp; &nbsp; Dim strlong As Long<br>&nbsp; &nbsp; Dim point As POINTAPI<br>&nbsp; &nbsp; point.x = x<br>&nbsp; &nbsp; point.y = y<br>&nbsp; &nbsp; '将客户坐标转化为屏幕坐标并显示在PointText文本框中<br>&nbsp; &nbsp; If ClientToScreen(frmMain.hwnd, point) = 0 Then Exit Sub<br>&nbsp; &nbsp; PointText.Text = Str(point.x) + "," + Str(point.y)<br>&nbsp; &nbsp; '获得鼠标所在的窗口句柄并显示在hWndText文本框中<br>&nbsp; &nbsp; curwnd = WindowFromPoint(point.x, point.y)<br>&nbsp; &nbsp; hWndText.Text = Str(curwnd)<br>&nbsp; &nbsp; '获得该窗口的类型并显示在WndClassText文本框中<br>&nbsp; &nbsp; tempstr = Space(255)<br>&nbsp; &nbsp; strlong = Len(tempstr)<br>&nbsp; &nbsp; rtn = GetClassName(curwnd, tempstr, strlong)<br>&nbsp; &nbsp; If rtn = 0 Then Exit Sub<br>&nbsp; &nbsp; tempstr = Trim(tempstr)<br>&nbsp; &nbsp; WndClassText.Text = tempstr<br>&nbsp; &nbsp; '向该窗口发送一个WM_GETTEXT消息,以获得该窗口的文本,并显示在PasswordText文本框中<br>&nbsp; &nbsp; tempstr = Space(255)<br>&nbsp; &nbsp; strlong = Len(tempstr)<br>&nbsp; &nbsp; rtn = SendMessage(curwnd, WM_GETTEXT, strlong, tempstr)<br>&nbsp; &nbsp; tempstr = Trim(tempstr)<br>&nbsp; &nbsp; PasswordText.Text = tempstr<br>End If<br>&nbsp; &nbsp; <br>End Sub<br>
 
newnob:<br>那个程序是别人的还是你编自己的?
 
得到HANDLE后能不能得到该HANDLE的名字(前提这个HANDLE是FORM。HANDLE),<br>如果可以的话,你就可能根据comptentcount来取了!<br>for i=0 to comptentcount do<br>begin<br>&nbsp; if &nbsp; &nbsp;comptents.classtype="tedit" then<br>.......<br>end;
 
[^]To savenight<br>客户程序,别的程序,窗口,部件 :均是指别人用别的语言编的程序。<br>在此程序执行中,我要向此程序输入东西。即要SendMessage。<br><br>To 天真<br>因为上面的原因,所以你的方法是行不通的。<br><br>To zxb200<br>要输入的Edit,与别的Edit,只有在窗口中的位置不同,所以我是想用位置来做。<br>但 mikegong 也许提供了一种好的方法:利用数组。<br><br><br>
 
你获得它们的HANDLE是干什么用呢?可以用其他方法解决嘛。
 
[^]To apple117<br>你的代码是一个看密码的程序,要用鼠标来定位,这个我知道, WindowFromPoint。<br><br>我想要的是已知窗口中某个Edit框的位置,但此窗口不止一个Edit框,现在要向此框发送消息。<br>不要即时用鼠标来定位Edit的位置,这样每次做此事时都要用鼠标定位了。<br>
 
[^]To 荷塘新月<br>要向一个别的程序中部件发送信息。如向一个别人编好的程序中的Edit框中发送字符串。<br>或别人编好的程序中的CheckBox发送选中消息。
 
[^]从昨天到今天,这里讨论的人还真多。谢谢大家。<br><br>我想还是从两方面考虑:<br>1. &nbsp;Handle := WindowFromPoint(Pos);<br>可以通过此,获得具体Edit的Handle。那么我如何来确定这个Edit在显示时的位置呢?<br>当然客户程序窗口是固定的。那么也许可以利用这个Edit在窗口中的位置,<br>及窗口在屏幕的位置来确定Pos。<br><br>事先,这个Edit在窗口中的位置可以从一个API得到。(是哪一个我记不起了。得找找。)<br>在我的程序执行时,先读取这个Edit在窗口中的位置的记录,然后获得窗口在屏幕的位置。<br>(API是哪一个我记不起了。得找找。)这样就可以得到这个Pos,然后得到Handle,<br>就可以发送消息了。<br><br>2.mikegong的好方法,可是每次客户程序执行时,<br>用此方法获得的数组中的每一个的变量对应的部件是不是每次都一样呢?<br>例如数组中第五个变量是不是每次都对应于客户程序窗口中同一个部件?<br>值得一提的是在窗口中如果还有一个列表框,而列表框可能在每次程序执行时<br>列项可能有多有少。这个时候此数组中元素还是固定对应于窗口中的部件吗?<br><br>谁能给出方法1的API函数?或方法2的答案?
 
等我明天查查再来。
 
用TList比较好
 
[^]To LoveStory<br>你的意思是不是将数组对应部件加入到TList中,然后在程序中手工选择。<br>这样做太烦了。每次都要选择。
 
newnob:<br>我明白你的意思了。以前见过某学校的一个题库程序(FoxPro编的),一个界面有十几个输入框,还有checkbox,<br>数据只能挨个输,一页得按十几个Tab键,还有回车。。。<br>我当时也是你这样的想法----向这些Edit发数据(用刷屏的方法),但是正如你说的,如果Edit有很多的话,<br>处理起来就比较困难。所以我觉得这种方法不太好,当然如果你只是向某个Edit发数据,这种方法还是可行的。<br><br>〉〉那么我如何来确定这个Edit在显示时的位置呢?<br>鼠标向那个Edit一点不就行了。<br><br>
 
[^]<br>我是想这个我编的程序是要常运行的,不能每次执行后都用鼠标来获取客户程序中部件的位置。<br>所以我要事先先记录下该部件在窗口中的位置,在客户程序执行后再用窗口在屏幕的位置来<br>得到部件在屏幕的位置,然后用WindowFromPoint得到Handle。再发送消息。<br><br>鼠标向那个Edit得到的是客户程序在此次运行中部件所在屏幕的位置,如果下一次屏幕位置<br>被人移动了一下,那么用WindowFromPoint就得不到此部件的Handle了。<br><br>大家明白了吗?
 

Similar threads

后退
顶部