如何获得form1的窗口句柄呢?

时间:2022-04-22 12:01:01
比如我想点击 Navigate 打开的一个网页里面的 300 × 200 的一个坐标



var
 Gameh:HWND;
begin
      Gameh:=FindWindow(nil,'TForm1' );
     //模拟鼠标单击
     SendMessage(Gameh,Messages.WM_LBUTTONDOWN,0,$0180017A);//按下
     SendMessage(Gameh,Messages.WM_LBUTTONUP, 0, $0180017A);//抬起

我主要是不会获得窗口句柄

请教一下高手

39 个解决方案

#1


FindWindow如果正确返回就是form1的句柄

#2


var
 Gameh:HWND;
begin
Gameh:=form1.Handle;
...
...

#3


这样的话 我还是没办法点击网页中的指定位置啊
引用 2 楼 sgw520 的回复:
var
 Gameh:HWND;
begin
Gameh:=form1.Handle;
...
...

#4


是不是我的代码有问题呢

#5


具体代码怎么写 可否提醒下。。

引用 1 楼 bdmh 的回复:
FindWindow如果正确返回就是form1的句柄

#6


虽然不太明白你的意思,但是我刚才自己大概试了一下,应该能够实现你的功能,我做了如下的测试:
两个窗体,一个FORM1,一个FORM2,FORM1中的一个按钮显示出FORM2,在其mousedown方法中showmessage('test'),而FORM2中的一个按钮向FORM1发送消息,如下:
procedure TForm2.btn1Click(Sender: TObject);
VAR
  TheHandle:THandle;
begin
  TheHandle := Form1.Handle;
  SendMessage(TheHandle,Messages.WM_LBUTTONDOWN,0,0);
end;
点击FORM2的按钮后,FORM1能够正常showmessage,说明消息能够正常发送给FORM1。
如果你想控制FORM1中的坐标情况,可以在MOUSEDOWN中进行坐标的控制应该就可以了,不知道能否满足您的需要?

#7


难道是我的坐标获取的不对?
引用 6 楼 vokeyliu 的回复:
虽然不太明白你的意思,但是我刚才自己大概试了一下,应该能够实现你的功能,我做了如下的测试:
两个窗体,一个FORM1,一个FORM2,FORM1中的一个按钮显示出FORM2,在其mousedown方法中showmessage('test'),而FORM2中的一个按钮向FORM1发送消息,如下:
procedure TForm2.btn1Click(Sender: TObject);
VAR……

#8


果然是坐标选取的不对。

如果我想点击 100 50 的地方 怎么做呢?

引用 7 楼 loveifa 的回复:
难道是我的坐标获取的不对?
引用 6 楼 vokeyliu 的回复:

虽然不太明白你的意思,但是我刚才自己大概试了一下,应该能够实现你的功能,我做了如下的测试:
两个窗体,一个FORM1,一个FORM2,FORM1中的一个按钮显示出FORM2,在其mousedown方法中showmessage('test'),而FORM2中的一个按钮向FORM1发送消息,如下:
procedure ……

#9


Gameh:=FindWindow(nil,'Form1' );


Gameh:=form1.Handle;

#10


我的用意是想点击form里面的一个 webbrowser里面的一个地方 但是这样的话 是获取form的句柄还是获取到webbrowser的句柄呢?

引用 6 楼 vokeyliu 的回复:
虽然不太明白你的意思,但是我刚才自己大概试了一下,应该能够实现你的功能,我做了如下的测试:
两个窗体,一个FORM1,一个FORM2,FORM1中的一个按钮显示出FORM2,在其mousedown方法中showmessage('test'),而FORM2中的一个按钮向FORM1发送消息,如下:
procedure TForm2.btn1Click(Sender: TObject);
VAR……

#11


你应该是使用Webbrowser.navigate打开的网页吧?
你现在获取的是窗体Form的句柄.
应该获取到Webbrowser控件的句柄然后SendMessage;

#12


老大啊 我就是因为不知道怎么获取webbrowser的句柄啊。。

这是关键。

希望老大讲解下。。

引用 11 楼 lovemit 的回复:
你应该是使用Webbrowser.navigate打开的网页吧?
你现在获取的是窗体Form的句柄.
应该获取到Webbrowser控件的句柄然后SendMessage;

#13


procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://www.csdn.net');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  WebBrowser1.Perform(WM_CLOSE,1,1);
end;

#14


procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://www.csdn.net');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  //WebBrowser1.Perform(WM_CLOSE,1,1);
  Sendmessage(Webbrowser1.Handle,WM_CLOSE,1,1);
end;
两种都行。

#15


老大 这个怎么用啊 可以给解释下吗

引用 13 楼 foxyy8888 的回复:
procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://www.csdn.net');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  WebBrowser1.Perform(WM_CLOSE,……

#16


 Sendmessage(Webbrowser1.Handle,WM_CLOSE,1,1); 

后面两个1 怎么解释呢

#17


perform是VCL的封装,就是给自己发送个消息,就用不到句柄了。
而这个是通过webbrowser1.handle的到句柄,用的API发送
Sendmessage(Webbrowser1.Handle,WM_CLOSE,1,1);

#18


那两个1是我胡敲的,正好我左手在1那里。瀑布汗~
WM_CLOSE用不到吧。

#19


那么坐标怎么确定呢?

#20


wParam,lParam在WM_CLOSE消息里面完全无用,给什么都行。

#21


  sendmessage(webbrowser1.HWND,WM_LBUTTONDOWN,0,$00640064);

这样可以吗

引用 18 楼 foxyy8888 的回复:
那两个1是我胡敲的,正好我左手在1那里。瀑布汗~
WM_CLOSE用不到吧。

#22


sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064);
我试了webbrowser1.HWND好像是ActivX的什么东西,引用出错。
不是真正的句柄。

#23


那该怎么办呢?

引用 22 楼 foxyy8888 的回复:
sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064);
我试了webbrowser1.HWND好像是ActivX的什么东西,引用出错。
不是真正的句柄。

#24


var
    aPoint:TPoint;
通过GetCursorPos得到
    GetCursorPos(aPoint);
好像是这样的,记不太清楚了。

#25


引用 23 楼 loveifa 的回复:
那该怎么办呢?

引用 22 楼 foxyy8888 的回复:

sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064);
我试了webbrowser1.HWND好像是ActivX的什么东西,引用出错。
不是真正的句柄。


什么怎么办,你写的HWND,我告诉你用handle啊。

#26


老大 这个怎么用啊。。

引用 24 楼 foxyy8888 的回复:
var
    aPoint:TPoint;
通过GetCursorPos得到
    GetCursorPos(aPoint);
好像是这样的,记不太清楚了。

#27


我只想搞到 webbrowser的句柄。那就万事大吉了。。。

#28


受不了了
webbrowser1.handle 就是句柄。

#29




sendmessage(webbrowser1.HWND,WM_LBUTTONDOWN,0,$00640064);

但是这样写是报错的啊。。

程序无法运行哦。。

引用 28 楼 foxyy8888 的回复:
受不了了
webbrowser1.handle 就是句柄。

#30


你想得到From1的句柄就是Form1.handle,想得到Webbrowser1的句柄就是Webbrowser1.handle

#31


sendmessage(webbrowser1.HWND,WM_LBUTTONDOWN,0,$00640064);

.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle

#32


引用 25 楼 foxyy8888 的回复:
引用 23 楼 loveifa 的回复:

那该怎么办呢?

引用 22 楼 foxyy8888 的回复:

sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064);
我试了webbrowser1.HWND好像是ActivX的什么东西,引用出错。
不是真正的句柄。


什么怎么办,你写的HWND,我告诉你用han……

请把 .HWND换成 .handle
火大

#33


哥们,其实你这样做有很多问题的,如窗体大小发生了变化等等,所以我提供给你另外一个思路:上网所有一下delphi自动登陆网页,会有一些代码是关于DELPHI使用IHTML的,绝对对你有用处。可以实现DELPHI获取网页中的对象并且实现相应操作的。

#34


procedure TForm1.Button1Click(Sender: TObject);
var
Doc:IHTMLDocument2;
form:IHTMLFormElement;
userinputelement,pwdinputelement:ihtmlinputelement;
i:Integer;
begin
doc:=webbrowser1.document as ihtmldocument2;
userinputelement:=(doc.all.item('username_temp',0) as ihtmlinputelement);
userinputelement.value:='3876';
pwdinputelement:=(doc.all.item('password',0) as ihtmlinputelement);
pwdinputelement.value:='12345678';
WebBrowser1.OleObject.document.parentWindow.execScript('loginJudge()','JavaScript');
end;
希望对你有所启发

#35


老大我懂了

    sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064); // 按下鼠标左键
    sendmessage(webbrowser1.handle,WM_LBUTTONUP,0,$00640064);  //抬起鼠标左键

但是 这样依然是无法点击网页中的东西啊
引用 32 楼 foxyy8888 的回复:
引用 25 楼 foxyy8888 的回复:

引用 23 楼 loveifa 的回复:

那该怎么办呢?

引用 22 楼 foxyy8888 的回复:

sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064);
我试了webbrowser1.HWND好像是ActivX的什么东西,引用出错。
不是真正的句柄。
……

#36


鼠标位置还要有个desktop到window的转换
通过GetCursorPos得到的是鼠标在桌面的位置,还要转化成句柄所代表window的相对位置。
http://social.msdn.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/717b4df6-e418-44cb-9b8b-f4aee51bf053/

不过建议你用vokeyliu方式,所有的蜘蛛都是分析网页源码的,而不是这种模拟点击来进行的。

#37


    hookHwnd:=form1.handle;
    memo1.Text:=inttostr(hookHwnd);
这样完全可以正确的获取到句柄

但是
    hookHwnd:=webbrowser1.handle;
    memo1.Text:=inttostr(hookHwnd);

这样就获取不到正确的。

这是什么原因呢
引用 36 楼 foxyy8888 的回复:
鼠标位置还要有个desktop到window的转换
通过GetCursorPos得到的是鼠标在桌面的位置,还要转化成句柄所代表window的相对位置。
http://social.msdn.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/717b4df6-e418-44cb-9b8b-f4aee51bf053/

不过建议你用voke……

#38


我晕了  memo1.handle  form1.handle 都能正确获取到 就是webbrowser1.handle获取不到正确的值。。

这是bug 。。。必须的 啊。

#39


感谢楼上各位热心解答。不过都错了

我知道怎么搞了 谢谢 结贴

#1


FindWindow如果正确返回就是form1的句柄

#2


var
 Gameh:HWND;
begin
Gameh:=form1.Handle;
...
...

#3


这样的话 我还是没办法点击网页中的指定位置啊
引用 2 楼 sgw520 的回复:
var
 Gameh:HWND;
begin
Gameh:=form1.Handle;
...
...

#4


是不是我的代码有问题呢

#5


具体代码怎么写 可否提醒下。。

引用 1 楼 bdmh 的回复:
FindWindow如果正确返回就是form1的句柄

#6


虽然不太明白你的意思,但是我刚才自己大概试了一下,应该能够实现你的功能,我做了如下的测试:
两个窗体,一个FORM1,一个FORM2,FORM1中的一个按钮显示出FORM2,在其mousedown方法中showmessage('test'),而FORM2中的一个按钮向FORM1发送消息,如下:
procedure TForm2.btn1Click(Sender: TObject);
VAR
  TheHandle:THandle;
begin
  TheHandle := Form1.Handle;
  SendMessage(TheHandle,Messages.WM_LBUTTONDOWN,0,0);
end;
点击FORM2的按钮后,FORM1能够正常showmessage,说明消息能够正常发送给FORM1。
如果你想控制FORM1中的坐标情况,可以在MOUSEDOWN中进行坐标的控制应该就可以了,不知道能否满足您的需要?

#7


难道是我的坐标获取的不对?
引用 6 楼 vokeyliu 的回复:
虽然不太明白你的意思,但是我刚才自己大概试了一下,应该能够实现你的功能,我做了如下的测试:
两个窗体,一个FORM1,一个FORM2,FORM1中的一个按钮显示出FORM2,在其mousedown方法中showmessage('test'),而FORM2中的一个按钮向FORM1发送消息,如下:
procedure TForm2.btn1Click(Sender: TObject);
VAR……

#8


果然是坐标选取的不对。

如果我想点击 100 50 的地方 怎么做呢?

引用 7 楼 loveifa 的回复:
难道是我的坐标获取的不对?
引用 6 楼 vokeyliu 的回复:

虽然不太明白你的意思,但是我刚才自己大概试了一下,应该能够实现你的功能,我做了如下的测试:
两个窗体,一个FORM1,一个FORM2,FORM1中的一个按钮显示出FORM2,在其mousedown方法中showmessage('test'),而FORM2中的一个按钮向FORM1发送消息,如下:
procedure ……

#9


Gameh:=FindWindow(nil,'Form1' );


Gameh:=form1.Handle;

#10


我的用意是想点击form里面的一个 webbrowser里面的一个地方 但是这样的话 是获取form的句柄还是获取到webbrowser的句柄呢?

引用 6 楼 vokeyliu 的回复:
虽然不太明白你的意思,但是我刚才自己大概试了一下,应该能够实现你的功能,我做了如下的测试:
两个窗体,一个FORM1,一个FORM2,FORM1中的一个按钮显示出FORM2,在其mousedown方法中showmessage('test'),而FORM2中的一个按钮向FORM1发送消息,如下:
procedure TForm2.btn1Click(Sender: TObject);
VAR……

#11


你应该是使用Webbrowser.navigate打开的网页吧?
你现在获取的是窗体Form的句柄.
应该获取到Webbrowser控件的句柄然后SendMessage;

#12


老大啊 我就是因为不知道怎么获取webbrowser的句柄啊。。

这是关键。

希望老大讲解下。。

引用 11 楼 lovemit 的回复:
你应该是使用Webbrowser.navigate打开的网页吧?
你现在获取的是窗体Form的句柄.
应该获取到Webbrowser控件的句柄然后SendMessage;

#13


procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://www.csdn.net');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  WebBrowser1.Perform(WM_CLOSE,1,1);
end;

#14


procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://www.csdn.net');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  //WebBrowser1.Perform(WM_CLOSE,1,1);
  Sendmessage(Webbrowser1.Handle,WM_CLOSE,1,1);
end;
两种都行。

#15


老大 这个怎么用啊 可以给解释下吗

引用 13 楼 foxyy8888 的回复:
procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://www.csdn.net');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  WebBrowser1.Perform(WM_CLOSE,……

#16


 Sendmessage(Webbrowser1.Handle,WM_CLOSE,1,1); 

后面两个1 怎么解释呢

#17


perform是VCL的封装,就是给自己发送个消息,就用不到句柄了。
而这个是通过webbrowser1.handle的到句柄,用的API发送
Sendmessage(Webbrowser1.Handle,WM_CLOSE,1,1);

#18


那两个1是我胡敲的,正好我左手在1那里。瀑布汗~
WM_CLOSE用不到吧。

#19


那么坐标怎么确定呢?

#20


wParam,lParam在WM_CLOSE消息里面完全无用,给什么都行。

#21


  sendmessage(webbrowser1.HWND,WM_LBUTTONDOWN,0,$00640064);

这样可以吗

引用 18 楼 foxyy8888 的回复:
那两个1是我胡敲的,正好我左手在1那里。瀑布汗~
WM_CLOSE用不到吧。

#22


sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064);
我试了webbrowser1.HWND好像是ActivX的什么东西,引用出错。
不是真正的句柄。

#23


那该怎么办呢?

引用 22 楼 foxyy8888 的回复:
sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064);
我试了webbrowser1.HWND好像是ActivX的什么东西,引用出错。
不是真正的句柄。

#24


var
    aPoint:TPoint;
通过GetCursorPos得到
    GetCursorPos(aPoint);
好像是这样的,记不太清楚了。

#25


引用 23 楼 loveifa 的回复:
那该怎么办呢?

引用 22 楼 foxyy8888 的回复:

sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064);
我试了webbrowser1.HWND好像是ActivX的什么东西,引用出错。
不是真正的句柄。


什么怎么办,你写的HWND,我告诉你用handle啊。

#26


老大 这个怎么用啊。。

引用 24 楼 foxyy8888 的回复:
var
    aPoint:TPoint;
通过GetCursorPos得到
    GetCursorPos(aPoint);
好像是这样的,记不太清楚了。

#27


我只想搞到 webbrowser的句柄。那就万事大吉了。。。

#28


受不了了
webbrowser1.handle 就是句柄。

#29




sendmessage(webbrowser1.HWND,WM_LBUTTONDOWN,0,$00640064);

但是这样写是报错的啊。。

程序无法运行哦。。

引用 28 楼 foxyy8888 的回复:
受不了了
webbrowser1.handle 就是句柄。

#30


你想得到From1的句柄就是Form1.handle,想得到Webbrowser1的句柄就是Webbrowser1.handle

#31


sendmessage(webbrowser1.HWND,WM_LBUTTONDOWN,0,$00640064);

.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle

#32


引用 25 楼 foxyy8888 的回复:
引用 23 楼 loveifa 的回复:

那该怎么办呢?

引用 22 楼 foxyy8888 的回复:

sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064);
我试了webbrowser1.HWND好像是ActivX的什么东西,引用出错。
不是真正的句柄。


什么怎么办,你写的HWND,我告诉你用han……

请把 .HWND换成 .handle
火大

#33


哥们,其实你这样做有很多问题的,如窗体大小发生了变化等等,所以我提供给你另外一个思路:上网所有一下delphi自动登陆网页,会有一些代码是关于DELPHI使用IHTML的,绝对对你有用处。可以实现DELPHI获取网页中的对象并且实现相应操作的。

#34


procedure TForm1.Button1Click(Sender: TObject);
var
Doc:IHTMLDocument2;
form:IHTMLFormElement;
userinputelement,pwdinputelement:ihtmlinputelement;
i:Integer;
begin
doc:=webbrowser1.document as ihtmldocument2;
userinputelement:=(doc.all.item('username_temp',0) as ihtmlinputelement);
userinputelement.value:='3876';
pwdinputelement:=(doc.all.item('password',0) as ihtmlinputelement);
pwdinputelement.value:='12345678';
WebBrowser1.OleObject.document.parentWindow.execScript('loginJudge()','JavaScript');
end;
希望对你有所启发

#35


老大我懂了

    sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064); // 按下鼠标左键
    sendmessage(webbrowser1.handle,WM_LBUTTONUP,0,$00640064);  //抬起鼠标左键

但是 这样依然是无法点击网页中的东西啊
引用 32 楼 foxyy8888 的回复:
引用 25 楼 foxyy8888 的回复:

引用 23 楼 loveifa 的回复:

那该怎么办呢?

引用 22 楼 foxyy8888 的回复:

sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064);
我试了webbrowser1.HWND好像是ActivX的什么东西,引用出错。
不是真正的句柄。
……

#36


鼠标位置还要有个desktop到window的转换
通过GetCursorPos得到的是鼠标在桌面的位置,还要转化成句柄所代表window的相对位置。
http://social.msdn.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/717b4df6-e418-44cb-9b8b-f4aee51bf053/

不过建议你用vokeyliu方式,所有的蜘蛛都是分析网页源码的,而不是这种模拟点击来进行的。

#37


    hookHwnd:=form1.handle;
    memo1.Text:=inttostr(hookHwnd);
这样完全可以正确的获取到句柄

但是
    hookHwnd:=webbrowser1.handle;
    memo1.Text:=inttostr(hookHwnd);

这样就获取不到正确的。

这是什么原因呢
引用 36 楼 foxyy8888 的回复:
鼠标位置还要有个desktop到window的转换
通过GetCursorPos得到的是鼠标在桌面的位置,还要转化成句柄所代表window的相对位置。
http://social.msdn.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/717b4df6-e418-44cb-9b8b-f4aee51bf053/

不过建议你用voke……

#38


我晕了  memo1.handle  form1.handle 都能正确获取到 就是webbrowser1.handle获取不到正确的值。。

这是bug 。。。必须的 啊。

#39


感谢楼上各位热心解答。不过都错了

我知道怎么搞了 谢谢 结贴