用API实现

解决方案 »

  1.   

    http://blog.csdn.net/tonylk/archive/2005/09/30/492843.aspx根据上面文章写的代码
    不过发现很多问题,执行代码后,IE窗口确实被隐藏,
    用alt+tab可以切换显示,显示后任务栏会重新增加一个窗口图标。--------------------------------------------------
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, SHDocVw,MSHTML,ActiveX;
    type
      ITaskbarList = interface(IUnknown)
        ['{56FDF344-FD6D-11d0-958A-006097C9A090}']
        function HrInit():HRESULT;stdcall;
        function AddTab(hwnd:HWND):HRESULT;stdcall;
        function DeleteTab(hwnd:HWND):HRESULT;stdcall;
        function ActivateTab(hwnd:HWND):HRESULT;stdcall;
        function SetActiveAlt(hwnd:HWND):HRESULT;stdcall;
      end;  TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      ShellWindow: IShellWindows;
      IE:IWebBrowser2;
      IDoc:IHTMLDocument2;
      spDisp:IDispatch;  i : Integer;
      v : Olevariant;  TaskbarList:ITaskbarList;
    const
      CLSID_TaskbarList:TGUID='{56FDF344-FD6D-11d0-958A-006097C9A090}';
      IID_ITaskbarList:TGUID='{602D4995-B13A-429b-A66E-1935E44F4317}';begin
      ShellWindow := CoShellWindows.Create;
      for i:=0 to ShellWindow.Count-1 do
      begin
        v := i;
        spDisp := ShellWindow.Item(v);
        if Succeeded(spDisp.QueryInterface(IWebBrowser2,IE)) then
        begin
          if Succeeded(IE.Document.QueryInterface(IHTMLDocument2,IDoc)) then
          begin
            //找到指定的IE窗口
            if IDoc.url='http://www.csdn.net/' then
            begin
              if Succeeded(CoCreateInstance(CLSID_TaskbarList,Nil,CLSCTX_INPROC_SERVER,
                IID_ITaskbarList,TaskbarList)) then
              begin
                TaskbarList.HrInit();
                TaskbarList.DeleteTab(IE.HWND);
                TaskbarList := nil;
              end;
              Break;
            end;
          end;
        end;
      end;
    end;end.
      

  2.   

    有一个笨一点的办法,
    做一个无边框的透明窗体,
    用SetParent将透明窗体设置为IE窗体的父窗体
      

  3.   

    这种方法有一个缺陷:窗口标题栏会变得很难看//---------------------------------------
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, SHDocVw,MSHTML,ActiveX, ExtCtrls;
    type
      ITaskbarList = interface(IUnknown)
        ['{56FDF344-FD6D-11d0-958A-006097C9A090}']
        function HrInit():HRESULT;stdcall;
        function AddTab(hwnd:HWND):HRESULT;stdcall;
        function DeleteTab(hwnd:HWND):HRESULT;stdcall;
        function ActivateTab(hwnd:HWND):HRESULT;stdcall;
        function SetActiveAlt(hwnd:HWND):HRESULT;stdcall;
      end;  TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    {$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      ShellWindow: IShellWindows;
      IE:IWebBrowser2;
      IDoc:IHTMLDocument2;
      spDisp:IDispatch;  i : Integer;
      v : Olevariant;  TaskbarList : ITaskbarList;
      dwStyleOld : DWORD;const
      CLSID_TaskbarList:TGUID='{56FDF344-FD6D-11d0-958A-006097C9A090}';
      IID_ITaskbarList:TGUID='{602D4995-B13A-429b-A66E-1935E44F4317}';begin
      ShellWindow := CoShellWindows.Create;
      for i:=0 to ShellWindow.Count-1 do
      begin
        v := i;
        spDisp := ShellWindow.Item(v);
        if Succeeded(spDisp.QueryInterface(IWebBrowser2,IE)) then
        begin
          if Succeeded(IE.Document.QueryInterface(IHTMLDocument2,IDoc)) then
          begin
            //找到指定的IE窗口
            if IDoc.url='http://www.csdn.net/' then
            begin
              if Succeeded(CoCreateInstance(CLSID_TaskbarList,Nil,CLSCTX_INPROC_SERVER,
                IID_ITaskbarList,TaskbarList)) then
              begin
                //用ITaskbarList隐藏任务栏图标
                TaskbarList.HrInit();
                TaskbarList.DeleteTab(IE.HWND);
                TaskbarList := nil;            //IE窗口活动时,会重新在任务栏增加一个图标
                //取消WS_EX_APPWINDOW并增加WS_EX_TOOLWINDOW风格
                dwStyleOld := GetWindowLong(IE.HWND,GWL_EXSTYLE);
                SetWindowLong(IE.HWND,GWL_EXSTYLE,dwStyleOld or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
              end;
              //如果有多个IE窗口,就把Break注释掉,这样可以遍历所有窗口
              //Break;
             end;
          end;
        end;
      end;
    end;end.