各位朋友,想请教一下,假如自己用DELPHI作了一个程序,然后程序里面有一个EDIT1和BUTTON1,然后用户在EDIT1里面输入网页地址,怎样做,才能让用户点击BUTTON1之后,就能将EDIT1里面的网页地址发送到已经打开的浏览器的地址栏里面,然后在发送完网页地址之后,继续再发送一个回车的消息,可以使当前的浏览器跳转到该网页,请问怎样做,才能实现以上的功能呢?请帮忙提供一下具体的代码,解决之后,会另外开贴送分,谢谢!下面是自己所编写的代码,但该代码,只能找到当前浏览器的HANDLE,而不能找到地址栏的HANDLE,诚心求教,谢谢!
另外,自己也试过将这一句的代码:“ if SameText(s, 'TEdit') then ” 换成
if SameText(s, 'Edit') then
if SameText(s, 'Combobox') then
if SameText(s, 'TCombobox') then
都没有能找得到地址栏的HANDLE。
function gethandlebytxt(txt: string): THandle;
begin
Result := FindWindow(nil, pchar(txt));
end;function getpasswordhandle(): THandle;
var
h, childh: THandle;
s: string;
l: integer;
begin
Result := 0;
h := gethandlebytxt('搜索群 - 腾讯QQ群 - 傲游 [Maxthon]');//经过测试,这个HANDLE是可以找得到的!
childh := GetWindow(h, GW_CHILD);
repeat
setlength(s, 255);
l := GetClassName(childh, @s[1], 255);
SetLength(s, l);
if SameText(s, 'TEdit') then
begin
Result := childh;
exit;
end;
childh := GetWindow(childh, GW_HWNDNEXT);
until childh = 0; ;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
setuphandle, h: thandle;
begin
h := getpasswordhandle; edit1.SelectAll;
edit1.CopyToClipboard;
SendMessage(h, EM_SETSEL, 0, -1);
SendMessage(h, WM_PASTE, 0, 0);end;
另外,自己也试过将这一句的代码:“ if SameText(s, 'TEdit') then ” 换成
if SameText(s, 'Edit') then
if SameText(s, 'Combobox') then
if SameText(s, 'TCombobox') then
都没有能找得到地址栏的HANDLE。
function gethandlebytxt(txt: string): THandle;
begin
Result := FindWindow(nil, pchar(txt));
end;function getpasswordhandle(): THandle;
var
h, childh: THandle;
s: string;
l: integer;
begin
Result := 0;
h := gethandlebytxt('搜索群 - 腾讯QQ群 - 傲游 [Maxthon]');//经过测试,这个HANDLE是可以找得到的!
childh := GetWindow(h, GW_CHILD);
repeat
setlength(s, 255);
l := GetClassName(childh, @s[1], 255);
SetLength(s, l);
if SameText(s, 'TEdit') then
begin
Result := childh;
exit;
end;
childh := GetWindow(childh, GW_HWNDNEXT);
until childh = 0; ;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
setuphandle, h: thandle;
begin
h := getpasswordhandle; edit1.SelectAll;
edit1.CopyToClipboard;
SendMessage(h, EM_SETSEL, 0, -1);
SendMessage(h, WM_PASTE, 0, 0);end;
http://hi.baidu.com/fenghuo521/blog/item/8a765c2f3164553d1f308918.html
大虾不敢当,我也是个新手。你用的是哪个版本的IE?我自己的电脑上装的是VISTA系统,IE7,版本不一样,各控件的层次可能也有差别
可以通过接口直接控制外部浏览器转向新网页,没有必要通过地址栏。当然,如果你一定要通过地址栏也不是不行,遍历一下窗口控件就可以了。只不过你要考虑的情况比较多,例如浏览器中没有地址栏。而且你发送WM_PASTE这样的消息而占用剪切板也是非常不科学的。破坏了用户的剪切板数据。我对控制外部网页及自动填表或登录提交等比较擅长,目前可以回答你的一些简单问题,请加我的群。
function MyFindWindow : THandle;
const
// 父窗口类名数组
A_szClassName : array [0..3] of PChar = (
'Maxthon2_Frame',
'XTPDockBar',
'XTPToolBar',
'RichEdit20W'
);
// 父窗口标题数组
A_szWinName : array [0..3] of PChar = (
'100分求助-如何发送一个消息给浏览器的地址栏? - 傲游(Maxthon) 2.5.3',
'xtpBarTop',
'地址栏',
''
);
var
i : Integer;
hLastWin : THandle;
begin
// 首先求得顶级父窗口
hLastWin := FindWindow(A_szClassName[0], A_szWinName[0]);
// 逐次用FindWindowEx函数求出各级子窗口
for i:=1 to 3 do
begin
hLastWin := FindWindowEx(hLastWin, THandle(nil),
A_szClassName[i], A_szWinName[i]);
end;
result := hLastWin;
end;
// 举例: hLastWin : THandle;
// hLastWin := MyFindWindow();
因为具体代码如下:var
Form1: TForm1;
implementation
{$R *.DFM}
Function GetURL(H:hwnd;lparam:longint):boolean;stdcall;
var str,url:array [0..254] of char;
begin
getclassname(h,@str,255);
if strpas(@str)='ComboBoxEx32' then // ComboBoxEx32可以改成Edit.
begin
SendMessage(h,WM_GETTEXT,255,LongInt(@url));
SendMessage(h,WM_SETTEXT,255,longint(pchar('http://www.sina.com.cn')));
Sendmessage(h,WM_KEYDOWN,VK_Return,1);
form1.ListBox1.Items.Add(strpas(@url));
end;
result:=true;
end;
function callbackproc(H:HWnd;lparam:longint):Boolean;stdcall;
var str:array [1..255] of char;
begin
getclassname(h,@str,255);
if ((strpas(@str)='CabinetWClass') or (strpas(@str)='IEFrame')) then
begin
Enumchildwindows(h,@GetURL,0);
end;
result:=true;
end;procedure TForm1.findbuttonClick(Sender: TObject);
begin
listbox1.Clear;
Enumwindows(@callbackproc,0);
end;