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






4.93/5 (12投票s)
2003年11月15日
6分钟阅读

233255

5696
桌面小部件是提供常用功能的小应用程序,例如闹钟、链接到Google的文本框等。它们还可以装饰桌面。本文将介绍一种使用嵌入式IE浏览器在PC上创建桌面小部件的方法。
引言
桌面小部件是提供常用功能的小应用程序,例如闹钟、计算器、链接到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。
图1。
但有时我们确实希望在窗口标题中看到小部件名称,并通过菜单访问功能,因此我们可以像Windows Media Player那样显示和隐藏窗口标题。即鼠标移入小部件时显示标题和菜单,鼠标移出小部件时则隐藏它们。参见图2。
图 2
左侧是鼠标移入的小部件容器,右侧是鼠标移出的小部件容器。
白色区域是嵌入的IE浏览器。周围有一个浅灰色边框。这是一个非常重要的区域,充当处理程序,允许用户拖动或移动小部件。当然,其颜色可以自定义为与桌面颜色相同,以在视觉上隐藏该区域。
以下是容器程序要求的摘要。
- 拥有一个没有滚动条和外部3D边框的嵌入式IE浏览器
- 自动显示或隐藏窗口标题和菜单,类似于Windows Media Player
- 可以定义窗口大小、边框颜色和要在IE中加载的文件
- 可以拖动并放置在桌面上
设计细节
-
嵌入和自定义IE浏览器
选择C#编码并非因为只有C#能完成这项工作,实际上Delphi和VB6/VC++也可以做到。也许在部署方面,非托管代码中的这个小部件容器会更好。但我恰好下载了Borland C# Builder个人版,一个非常好的工具,最重要的是,我从Code Project找到了关于自定义嵌入式IE浏览器相关的文章。它们是:
- 组件化开发与 Visual C#
作者:Wiley Technology Publishing
- 文章:Using MSHTML Advanced Hosting Interfaces
作者:Nikhil Dabas
这两篇文章展示了如何通过实现
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边框。
- 组件化开发与 Visual C#
-
显示或隐藏窗口标题和菜单
很简单,在鼠标进入事件中显示标题和菜单,在鼠标离开事件中延迟隐藏标题;也就是说,不是立即隐藏,而是通过一个定时器,给予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
-
解析命令行参数
以下是一个简单的代码来处理一个简单的模式。
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
我们也可以使用一些现有的更强大的命令行解析工具,例如
- C# 中的自动命令行解析
作者:Ray Hayes
- C# 中的自动命令行解析
-
拖动客户区时移动窗口
使用的方法来自:
概念是通过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.dll和partial.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控件,您就可以使用本文中的程序将它们制作成桌面小部件。祝您玩得开心。