65.9K
CodeProject 正在变化。 阅读更多。
Home

使用嵌入式 IE 浏览器创建桌面小部件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (12投票s)

2003年11月15日

6分钟阅读

viewsIcon

233255

downloadIcon

5696

桌面小部件是提供常用功能的小应用程序,例如闹钟、链接到Google的文本框等。它们还可以装饰桌面。本文将介绍一种使用嵌入式IE浏览器在PC上创建桌面小部件的方法。

Sample Image - DesktopWidget.jpg

引言

桌面小部件是提供常用功能的小应用程序,例如闹钟、计算器、链接到Google的文本框等。它们还可以装饰桌面。

在Mac OS上,有一个著名桌面小部件引擎,Konfabulator。它允许用户使用JavaScript创建小部件。在PC上,也有一个桌面小部件引擎,DesktopX。还有一个基于Java的平台独立桌面小部件脚本引擎,DeskBlox。它们都是非常好的商业软件。

本文将介绍另一种在PC上使用嵌入式IE浏览器创建桌面小部件的方法。它可以将HTML页面、Flash动画、Java小程序和ActiveX控件等转换为桌面小部件。非常易于使用且免费。

想法和要求

Internet Explorer不仅是一个网页浏览器,还是一个显示图像文件、HTML页面、Flash动画、Java小程序和ActiveX控件以及执行JavaScript的强大平台。它是桌面小部件应用程序的理想宿主。

但是,如果以带标题栏、滚动条和粗边框的普通IE窗口作为桌面小部件打开,桌面会显得非常丑陋。因此,必须将IE嵌入到一个容器程序中,使其看起来像是与桌面融为一体。参见图1。

figure 1 - IE as widget

图1。

但有时我们确实希望在窗口标题中看到小部件名称,并通过菜单访问功能,因此我们可以像Windows Media Player那样显示和隐藏窗口标题。即鼠标移入小部件时显示标题和菜单,鼠标移出小部件时则隐藏它们。参见图2。

figure 2 - Show/Hide title

图 2

左侧是鼠标移入的小部件容器,右侧是鼠标移出的小部件容器。

白色区域是嵌入的IE浏览器。周围有一个浅灰色边框。这是一个非常重要的区域,充当处理程序,允许用户拖动或移动小部件。当然,其颜色可以自定义为与桌面颜色相同,以在视觉上隐藏该区域。

以下是容器程序要求的摘要。

  • 拥有一个没有滚动条和外部3D边框的嵌入式IE浏览器
  • 自动显示或隐藏窗口标题和菜单,类似于Windows Media Player
  • 可以定义窗口大小、边框颜色和要在IE中加载的文件
  • 可以拖动并放置在桌面上

设计细节

  1. 嵌入和自定义IE浏览器

    选择C#编码并非因为只有C#能完成这项工作,实际上Delphi和VB6/VC++也可以做到。也许在部署方面,非托管代码中的这个小部件容器会更好。但我恰好下载了Borland C# Builder个人版,一个非常好的工具,最重要的是,我从Code Project找到了关于自定义嵌入式IE浏览器相关的文章。它们是:

    这两篇文章展示了如何通过实现IDocHostUIHandler接口来移除滚动条和3D边框,并提供了示例代码。

    从Nikhil Dabas文章的源zip中,我们可以找到所需的MsHtmHstInterop.dll,但找不到mshtml.dll。它可以在著名的RSS聚合器SharpReader的部署包中找到。名为partial.mshtml.dll,它是mshtml.dll的一个更好、更紧凑的版本;足以仅访问IDocHostUIHandler接口和IHTMLDocument2接口。

    我在本文的源下载中包含了这两个DLL。通过引用它们,我们可以像这样使用它们:

    using mshtml;
    using MsHtmHstInterop;

    当然,在使用它们之前,您应该已经创建了一个带有IE ActiveX控件和一些菜单的WinForm...

    接下来是在主窗体上实现IDocHostUIHandler接口。

    public class Form1 : System.Windows.Forms.Form, IDocHostUIHandler
    {
        #region IDocHostUIHandler implementation
        ....
        #endregion
    }

    IDocHostUIHandler implementation区域的代码与Nikhil Dabas文章中的代码相同,除了GetHostInfo函数有一点不同。

    void IDocHostUIHandler.GetHostInfo(ref _DOCHOSTUIINFO pInfo)
    {
       pInfo.dwFlags |= ( 0x08 /*DOCHOSTUIFLAG_SCROLL_NO*/ |      
                          0x04 /*DOCHOSTUIFLAG_NO3DBORDER*/
      
       );
    }

    这两个魔法数字完成了我们所需的所有自定义技巧,即移除滚动条和3D边框。

  2. 显示或隐藏窗口标题和菜单

    很简单,在鼠标进入事件中显示标题和菜单,在鼠标离开事件中延迟隐藏标题;也就是说,不是立即隐藏,而是通过一个定时器,给予3秒钟的延迟,以避免标题突然消失。

    隐藏标题和菜单是通过为WinForm的Region属性设置新值来实现的。此方法也可用于创建不规则形状的窗口。

    #region show / hide title
      private void Form1_MouseLeave(object sender, System.EventArgs e)
      {
       this.timer1.Enabled = true;
      }
      private void Form1_MouseEnter(object sender, System.EventArgs e)
      {
       showTitle();
       this.timer1.Enabled = false;
      }
      private void hideTitle()
      {
       GraphicsPath gPath = new System.Drawing.Drawing2D.GraphicsPath();
       int hh = (this.Height - this.ClientSize.Height);
       gPath.AddRectangle(new RectangleF(10, 
            hh, this.Width-20, this.Height-hh-10));
       this.Region = new System.Drawing.Region(gPath);
      }
      private void showTitle()
      {
       GraphicsPath gPath = new System.Drawing.Drawing2D.GraphicsPath();
       gPath.AddRectangle(new RectangleF(0, 0, this.Width, this.Height));
       this.Region = new System.Drawing.Region(gPath);
      }
      private void timer1_Tick(object sender, System.EventArgs e)
      {
       hideTitle();
       this.timer1.Enabled = false;
      }
      #endregion
  3. 解析命令行参数

    以下是一个简单的代码来处理一个简单的模式。

       for (int ii = 0; ii < args.Length && args[ii][0] == '-'; ++ii)
       {
        if (args[ii].Equals("-html") && ii + 1 < args.Length)
        {
         htmlfn = args[++ii];
        }
        else if (args[ii].Equals("-width") && ii + 1 < args.Length)
        {
         try
         {
          ww = Convert.ToInt32(args[++ii]);
         }
         catch {}
        }
       
        ......
       }
    

    它可以以-param value的形式读取参数值对,

    例如:-html clock.htm -width 200 -height 150

    我们也可以使用一些现有的更强大的命令行解析工具,例如

  4. 拖动客户区时移动窗口

    使用的方法来自:

    概念是通过Win32 API将鼠标命中切换到WM_NCLBUTTONDOWN

      #region move window while drag in the client area
      private void Form1_MouseDown(object sender, 
              System.Windows.Forms.MouseEventArgs e)
      {
       ReleaseCapture();
       SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
      }
      public const int WM_NCLBUTTONDOWN = 0xA1;
      public const int HTCAPTION = 0x2;
      [DllImportAttribute ("user32.dll")]
      public static extern int SendMessage(IntPtr hWnd, 
                         int Msg, int wParam, int lParam);
      [DllImportAttribute ("user32.dll")]
      public static extern bool ReleaseCapture();
      #endregion

到目前为止,我们已经有了处理四个主要需求的全部解决方案。

构建应用程序

您可以下载源文件并使用Borland C# Builder进行构建。如果您使用VS.NET,您需要创建一个项目并将WinForm.cs添加到项目中,并手动设置对MsHtmHstInterop.dllpartial.mshtml.dll的引用。

如果您不想编译源代码,那么只需打开演示zip文件即可开始创建桌面小部件。

构建小部件

经过有趣的编码后,是时候创建小部件了。

  • 右键单击DesktopWidget.exe以创建快捷方式
  • 将快捷方式重命名为Calculator
  • 右键单击快捷方式,选择属性菜单来设置命令行参数 -height 240 -width 250 -html html\cal.htm -bgcolor #000080
  • 通过双击快捷方式启动小部件

对每个小部件重复此操作。

注意:命令行参数的使用

  • -height:定义小部件窗口的高度
  • -width:定义小部件窗口的宽度
  • -bgcolor:定义边框颜色,最好与您的桌面颜色相同
  • -html:要加载的HTML文件名

我没有创建吸引人的小部件,只是去这里快速抓取了两个小部件,日历和时钟,以证明本文的理念。如果您在HTML中放入图片和动画,小部件一定会更漂亮。

结论

IE是桌面小部件应用程序的理想宿主。通过调整其UI,我们创建了一个通用的容器。下次访问http://www.dynamicdrive.com/http://www.jars.com/http://www.flashkit.com/或其他许多网站时,如果您发现有趣的DHTML、Flash动画、Java小程序、ActiveX控件,您就可以使用本文中的程序将它们制作成桌面小部件。祝您玩得开心。

© . All rights reserved.