IActiveDesktop(活动桌面)接口是否可以返回桌面上IWebBrowser2的指针?以便用程序来控制,比如用这个指针 pWeb->Navigate2("http://www.sohu.com")。或者用其它的方法实现也可以,只要可以从外面控制活动桌面。注意:要点是返回活动桌面的IE指针,可以直接控制活动桌面内容为准,不是通过IActiveDesktop的SetWallPaper之类的调用。给分100,人民币50(鼓动一下),银行转帐,言而有信!第一个真正实现的回答为准。EMail:[email protected]

解决方案 »

  1.   

    //SHELL外壳编程之IE完全控制
    //前提条件:安装Microsoft shell controls and automation 类型库
    //在Delphi中选Project Import Type Library命令,选择Microsoft shell controls and automation 类型库,
    //点install后,在ACTIVEX控件板上多了几个组件,把TShell拖到桌面//说明:本人安装Microsoft shell controls and automation 类型库过程中碰到几个小问题,本人用的是
    //DELPHI6+WIN2000,就是安装后出现4-6处编译错误:“只读属性不能被赋值”,比如下面就是一处错误:
    //procedure TShellLinkObjectProperties.Set_Hotkey(piHK: SYSINT);
    //begin
    //  DefaultInterface.Hotkey := piHK;就是这条语句出错
    //end;
    //解决办法:用鼠标右击出错处的HOTKEY,选弹出菜单的FIND DECLARATION,你会看到这条语句:
    //   property Hotkey: SYSINT read Get_Hotkey;原来是因为HOTKEY属性只定义了读方法,没有定义
    //写方法,所以编译出错,知道出错原因,改就容易了,把它改成:
    // property Hotkey: SYSINT read Get_Hotkey write Set_Hotkey,其中Set_Hotkey出错位置的过程名,
    //其它几处错误就按上面的办法修改,成功后,ACTIVEX控件板就多了好几个组件,把TShell拖到桌面
    //下面源代码
    unit UtIEControl;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, OleServer, Shell32_TLB, StdCtrls;type
      TForm1 = class(TForm)
        BtnGetCount: TButton;
        Shell1: TShell;
        BtnGoHome: TButton;
        BtnNavigator: TButton;
        BtnClose: TButton;
        edtURL: TEdit;
        lblURL: TLabel;
        procedure BtnGetCountClick(Sender: TObject);
        procedure BtnGoHomeClick(Sender: TObject);
        procedure BtnNavigatorClick(Sender: TObject);
        procedure BtnCloseClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    uses shdocvw;/////////////
    {$R *.dfm}procedure TForm1.BtnGetCountClick(Sender: TObject);
    var
        shWin:IShellWindows;
    begin
            shWin:=Shell1.windows as IShellWindows;
            showMessage(IntToStr(shWin.get_count));//当前桌面上打开的IE窗口数目
    end;procedure TForm1.BtnGoHomeClick(Sender: TObject);
    var
        shWin:IShellWindows;
        wb:IWebBrowser2;
        i,j:integer;
    begin
            shWin:=Shell1.windows as IShellWindows;
            i:=shWin.get_count;
            if i>0 then
                    for j:=0 to i-1 do
                    begin
                            wb:=shWin.item(j) as IWebBrowser2;
                            wb.GoHome ;//将当前桌面上打开的所有IE窗口切换到主页
                    end;
    end;procedure TForm1.BtnNavigatorClick(Sender: TObject);
    var
        shWin:IShellWindows;
        wb:IWebBrowser2;
        i,j:integer;
        flag,url:olevariant;
    begin
            shWin:=Shell1.windows as IShellWindows;
            i:=shWin.get_count;
            flag:=0;
            url:=edtURL.Text ;
            if i>0 then
                    for j:=0 to i-1 do
                    begin
                            wb:=shWin.item(j) as IWebBrowser2;
                            wb.Navigate2(url,flag,flag,flag,flag);
    //将当前桌面上打开的所有IE窗口切换到edtURL指定的页面
                    end;
    end;procedure TForm1.BtnCloseClick(Sender: TObject);
    var
        shWin:IShellWindows;
        wb:IWebBrowser2;
        i,j:integer;
    begin
            shWin:=Shell1.windows as IShellWindows;
            i:=shWin.get_count;
            if i>0 then
                    for j:=0 to i-1 do
                    begin
                            wb:=shWin.item(j) as IWebBrowser2;
                            wb.quit;//将当前桌面上打开的所有IE窗口关闭
                    end;
    end;end.
    //事实上,有了上述ACTIVEX控件,你可以对IE窗口做任意你想要的控制,具体方法自已研究吧!
    //说明,资源管理器窗口也是IE窗口,以上代码同时对资源管理器窗口起作用,如果要区分它们也是很容易
    //的,不是吗?^_^
      

  2.   

    谢谢yang6130(月明@沧海) 的回答!但这个方法返回的还是IE窗口,而不是活动桌面的IE,活动桌面里面应该是一个IE控件,怎样控制活动桌面中的IE呢?
      

  3.   

    当不打开IE或资源管理器,但打开活动桌面时,GetCount返回0。