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;
...
...
Gameh:HWND;
begin
Gameh:=form1.Handle;
...
...
#3
这样的话 我还是没办法点击网页中的指定位置啊
#4
是不是我的代码有问题呢
#5
具体代码怎么写 可否提醒下。。
#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中进行坐标的控制应该就可以了,不知道能否满足您的需要?
两个窗体,一个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
难道是我的坐标获取的不对?
#8
果然是坐标选取的不对。
如果我想点击 100 50 的地方 怎么做呢?
如果我想点击 100 50 的地方 怎么做呢?
#9
Gameh:=FindWindow(nil,'Form1' );
?
Gameh:=form1.Handle;
?
Gameh:=form1.Handle;
#10
我的用意是想点击form里面的一个 webbrowser里面的一个地方 但是这样的话 是获取form的句柄还是获取到webbrowser的句柄呢?
#11
你应该是使用Webbrowser.navigate打开的网页吧?
你现在获取的是窗体Form的句柄.
应该获取到Webbrowser控件的句柄然后SendMessage;
你现在获取的是窗体Form的句柄.
应该获取到Webbrowser控件的句柄然后SendMessage;
#12
老大啊 我就是因为不知道怎么获取webbrowser的句柄啊。。
这是关键。
希望老大讲解下。。
这是关键。
希望老大讲解下。。
#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;
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;
两种都行。
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
老大 这个怎么用啊 可以给解释下吗
#16
Sendmessage(Webbrowser1.Handle,WM_CLOSE,1,1);
后面两个1 怎么解释呢
后面两个1 怎么解释呢
#17
perform是VCL的封装,就是给自己发送个消息,就用不到句柄了。
而这个是通过webbrowser1.handle的到句柄,用的API发送
Sendmessage(Webbrowser1.Handle,WM_CLOSE,1,1);
而这个是通过webbrowser1.handle的到句柄,用的API发送
Sendmessage(Webbrowser1.Handle,WM_CLOSE,1,1);
#18
那两个1是我胡敲的,正好我左手在1那里。瀑布汗~
WM_CLOSE用不到吧。
WM_CLOSE用不到吧。
#19
那么坐标怎么确定呢?
#20
wParam,lParam在WM_CLOSE消息里面完全无用,给什么都行。
#21
sendmessage(webbrowser1.HWND,WM_LBUTTONDOWN,0,$00640064);
这样可以吗
这样可以吗
#22
sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064);
我试了webbrowser1.HWND好像是ActivX的什么东西,引用出错。
不是真正的句柄。
我试了webbrowser1.HWND好像是ActivX的什么东西,引用出错。
不是真正的句柄。
#23
那该怎么办呢?
#24
var
aPoint:TPoint;
通过GetCursorPos得到
GetCursorPos(aPoint);
好像是这样的,记不太清楚了。
aPoint:TPoint;
通过GetCursorPos得到
GetCursorPos(aPoint);
好像是这样的,记不太清楚了。
#25
什么怎么办,你写的HWND,我告诉你用handle啊。
#26
老大 这个怎么用啊。。
#27
我只想搞到 webbrowser的句柄。那就万事大吉了。。。
#28
受不了了
webbrowser1.handle 就是句柄。
webbrowser1.handle 就是句柄。
#29
sendmessage(webbrowser1.HWND,WM_LBUTTONDOWN,0,$00640064);
但是这样写是报错的啊。。
程序无法运行哦。。
#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
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
#32
请把 .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;
希望对你有所启发
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); //抬起鼠标左键
但是 这样依然是无法点击网页中的东西啊
sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064); // 按下鼠标左键
sendmessage(webbrowser1.handle,WM_LBUTTONUP,0,$00640064); //抬起鼠标左键
但是 这样依然是无法点击网页中的东西啊
#36
鼠标位置还要有个desktop到window的转换
通过GetCursorPos得到的是鼠标在桌面的位置,还要转化成句柄所代表window的相对位置。
http://social.msdn.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/717b4df6-e418-44cb-9b8b-f4aee51bf053/
不过建议你用vokeyliu方式,所有的蜘蛛都是分析网页源码的,而不是这种模拟点击来进行的。
通过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);
这样就获取不到正确的。
这是什么原因呢
memo1.Text:=inttostr(hookHwnd);
这样完全可以正确的获取到句柄
但是
hookHwnd:=webbrowser1.handle;
memo1.Text:=inttostr(hookHwnd);
这样就获取不到正确的。
这是什么原因呢
#38
我晕了 memo1.handle form1.handle 都能正确获取到 就是webbrowser1.handle获取不到正确的值。。
这是bug 。。。必须的 啊。
这是bug 。。。必须的 啊。
#39
感谢楼上各位热心解答。不过都错了
我知道怎么搞了 谢谢 结贴
我知道怎么搞了 谢谢 结贴
#1
FindWindow如果正确返回就是form1的句柄
#2
var
Gameh:HWND;
begin
Gameh:=form1.Handle;
...
...
Gameh:HWND;
begin
Gameh:=form1.Handle;
...
...
#3
这样的话 我还是没办法点击网页中的指定位置啊
#4
是不是我的代码有问题呢
#5
具体代码怎么写 可否提醒下。。
#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中进行坐标的控制应该就可以了,不知道能否满足您的需要?
两个窗体,一个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
难道是我的坐标获取的不对?
#8
果然是坐标选取的不对。
如果我想点击 100 50 的地方 怎么做呢?
如果我想点击 100 50 的地方 怎么做呢?
#9
Gameh:=FindWindow(nil,'Form1' );
?
Gameh:=form1.Handle;
?
Gameh:=form1.Handle;
#10
我的用意是想点击form里面的一个 webbrowser里面的一个地方 但是这样的话 是获取form的句柄还是获取到webbrowser的句柄呢?
#11
你应该是使用Webbrowser.navigate打开的网页吧?
你现在获取的是窗体Form的句柄.
应该获取到Webbrowser控件的句柄然后SendMessage;
你现在获取的是窗体Form的句柄.
应该获取到Webbrowser控件的句柄然后SendMessage;
#12
老大啊 我就是因为不知道怎么获取webbrowser的句柄啊。。
这是关键。
希望老大讲解下。。
这是关键。
希望老大讲解下。。
#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;
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;
两种都行。
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
老大 这个怎么用啊 可以给解释下吗
#16
Sendmessage(Webbrowser1.Handle,WM_CLOSE,1,1);
后面两个1 怎么解释呢
后面两个1 怎么解释呢
#17
perform是VCL的封装,就是给自己发送个消息,就用不到句柄了。
而这个是通过webbrowser1.handle的到句柄,用的API发送
Sendmessage(Webbrowser1.Handle,WM_CLOSE,1,1);
而这个是通过webbrowser1.handle的到句柄,用的API发送
Sendmessage(Webbrowser1.Handle,WM_CLOSE,1,1);
#18
那两个1是我胡敲的,正好我左手在1那里。瀑布汗~
WM_CLOSE用不到吧。
WM_CLOSE用不到吧。
#19
那么坐标怎么确定呢?
#20
wParam,lParam在WM_CLOSE消息里面完全无用,给什么都行。
#21
sendmessage(webbrowser1.HWND,WM_LBUTTONDOWN,0,$00640064);
这样可以吗
这样可以吗
#22
sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064);
我试了webbrowser1.HWND好像是ActivX的什么东西,引用出错。
不是真正的句柄。
我试了webbrowser1.HWND好像是ActivX的什么东西,引用出错。
不是真正的句柄。
#23
那该怎么办呢?
#24
var
aPoint:TPoint;
通过GetCursorPos得到
GetCursorPos(aPoint);
好像是这样的,记不太清楚了。
aPoint:TPoint;
通过GetCursorPos得到
GetCursorPos(aPoint);
好像是这样的,记不太清楚了。
#25
什么怎么办,你写的HWND,我告诉你用handle啊。
#26
老大 这个怎么用啊。。
#27
我只想搞到 webbrowser的句柄。那就万事大吉了。。。
#28
受不了了
webbrowser1.handle 就是句柄。
webbrowser1.handle 就是句柄。
#29
sendmessage(webbrowser1.HWND,WM_LBUTTONDOWN,0,$00640064);
但是这样写是报错的啊。。
程序无法运行哦。。
#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
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
.handle
#32
请把 .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;
希望对你有所启发
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); //抬起鼠标左键
但是 这样依然是无法点击网页中的东西啊
sendmessage(webbrowser1.handle,WM_LBUTTONDOWN,0,$00640064); // 按下鼠标左键
sendmessage(webbrowser1.handle,WM_LBUTTONUP,0,$00640064); //抬起鼠标左键
但是 这样依然是无法点击网页中的东西啊
#36
鼠标位置还要有个desktop到window的转换
通过GetCursorPos得到的是鼠标在桌面的位置,还要转化成句柄所代表window的相对位置。
http://social.msdn.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/717b4df6-e418-44cb-9b8b-f4aee51bf053/
不过建议你用vokeyliu方式,所有的蜘蛛都是分析网页源码的,而不是这种模拟点击来进行的。
通过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);
这样就获取不到正确的。
这是什么原因呢
memo1.Text:=inttostr(hookHwnd);
这样完全可以正确的获取到句柄
但是
hookHwnd:=webbrowser1.handle;
memo1.Text:=inttostr(hookHwnd);
这样就获取不到正确的。
这是什么原因呢
#38
我晕了 memo1.handle form1.handle 都能正确获取到 就是webbrowser1.handle获取不到正确的值。。
这是bug 。。。必须的 啊。
这是bug 。。。必须的 啊。
#39
感谢楼上各位热心解答。不过都错了
我知道怎么搞了 谢谢 结贴
我知道怎么搞了 谢谢 结贴