各位朋友,想请教一下,假如自己用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;

解决方案 »

  1.   

    楼上的两位朋友,如果发消息到BHO呢?但小弟这个需求有点特别,必须要发送到当前浏览器的地址栏的,请再次赐教,谢谢!
      

  2.   

    BHO就是做这个的
    http://hi.baidu.com/fenghuo521/blog/item/8a765c2f3164553d1f308918.html
      

  3.   

    浏览器的地址栏句柄是可以找到的,你得先弄清楚浏览器上的各控件之间的层次关系,然后逐层深入,就可以找到了。查找主窗体用findwindow,查找子窗体句柄用findwindowex,查找同级的窗体句柄用GetWindow(handle,GW_HWNDNEXT),这三个语句配合使用,就可以找到所有有句柄的控件
      

  4.   

    楼上的各位高手,小弟用SPY++跟踪过,发现如果单独是地址栏的话,是EDIT类的,但如果地址栏+右边的下拉箭头,就是COMBOBOX类,请问5楼的大虾,能不能帮忙提供一下具体的代码,可以让程序找到地址栏的句柄 的,请赐教,谢谢!
      

  5.   

    BHO默认没有窗口的,你要在BHO里面自己创建一个窗口来接收消息。
      

  6.   


    大虾不敢当,我也是个新手。你用的是哪个版本的IE?我自己的电脑上装的是VISTA系统,IE7,版本不一样,各控件的层次可能也有差别
      

  7.   

    首先来说,楼主的思路就是错误的,你这种做法效率不高。
    可以通过接口直接控制外部浏览器转向新网页,没有必要通过地址栏。当然,如果你一定要通过地址栏也不是不行,遍历一下窗口控件就可以了。只不过你要考虑的情况比较多,例如浏览器中没有地址栏。而且你发送WM_PASTE这样的消息而占用剪切板也是非常不科学的。破坏了用户的剪切板数据。我对控制外部网页及自动填表或登录提交等比较擅长,目前可以回答你的一些简单问题,请加我的群。
      

  8.   

    // 以下是查找窗口 RichEdit20W 的代码:
    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();
      

  9.   

    12楼的说法很好。最好的办法就是向BHO发消息或者通过socket向BHO发指令,然后通过BHO跳转到你指定的任意网页。关于BHO控制IE跳转到指定网站的例子网上有,搜一下就能找到。
      

  10.   

    老大不用这么麻烦了。用BHO的话还得注册一个OCX控件。楼主的意思是并不需要这么复杂,
    因为具体代码如下: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;