从浏览器内 Silverlight 5 应用程序调用“运行”对话框






4.94/5 (9投票s)
如何直接从 Silverlight 5 应用程序打开“运行对话框”
引言
Silverlight 5 RC (Release Candidate) 已发布。此版本包含了一些新功能。其中,一项最重要的功能是 PInvoke。PInvoke 意为 Platform Invoke(平台调用)。使用此功能,您可以直接与系统资源通信,而无需使用 COM API。
在本文中,我们将更深入地探讨它,并向您展示如何直接从 Silverlight 5 应用程序打开“运行”对话框。在此,我们也使用浏览器内应用程序,您可以轻松将其移植到浏览器外。
先决条件
本文基于 Silverlight 5 RC。如果您尚未安装最新的 RC 版本,请从“下载 Silverlight 5 RC”下载。在下载和安装之前,请确保已完全卸载之前的 Silverlight 5 Beta 版本。
您还需要了解 Silverlight 5 RC 中对提升的信任设置的更改。请阅读博文“浏览器外和浏览器内提升的信任设置”。
完成上述先决条件后,让我们开始实际讨论 PInvoke,并提供一个简单的小演示。
概述
Platform Invoke 是 Silverlight 5 Release Candidate 中新增的功能。它不是一个类或方法,而是一种与系统资源通信的方式。如果您是 .NET 开发者,您一定了解 [DllImport(“”)]
属性,该属性用于在项目中包含系统程序集并调用那些 API。
在此,我将通过导入 Windows 系统的“shell32.dll”并调用 SHRunFileDialog()
API 调用来演示这一点。此方法接收不同的参数作为输入,并调用实际的“运行”对话框。您可以将适当的标题、描述作为参数传递给它,以更改对话框的文本。
玩转代码
要开始此操作,我们需要一个 enum
标志来设置 RunDialog
的一些标志参数。让 enum
继承自 uint,并为其设置 Flags()
作为属性。我们需要写出 API 暴露的正确 enum
值。以下是该 enum
的完整代码供您参考。
[Flags()]
public enum RunFileDialogFlags : uint
{
/// <summary>
/// Don't use any of the flags (only works alone)
/// </summary>
None = 0x0000,
/// <summary>
/// Removes the browse button
/// </summary>
NoBrowse = 0x0001,
/// <summary>
/// No default item selected
/// </summary>
NoDefault = 0x0002,
/// <summary>
/// Calculates the working directory from the file name
/// </summary>
CalcDirectory = 0x0004,
/// <summary>
/// Removes the edit box label
/// </summary>
NoLabel = 0x0008,
/// <summary>
/// Removes the separate memory space checkbox (Windows NT only)
/// </summary>
NoSeperateMemory = 0x0020
}
现在,我们需要使用 DllImport
属性导入 DLL。您还需要在代码隐藏文件中声明该 API。以下是该 API 的导入和声明。
[DllImport("shell32.dll", CharSet = CharSet.Auto,
EntryPoint = "#61", SetLastError = true)]
static extern bool SHRunFileDialog(IntPtr hwndOwner,
IntPtr hIcon,
string lpszPath,
string lpszDialogTitle,
string lpszDialogTextBody,
RunFileDialogFlags uflags);
现在是时候在我们的 Silverlight 应用程序中使用该 API 了。为此,我们将在 XAML 页面 MainPage.xaml 中添加一个按钮,并为其注册点击事件。在按钮的 Click 事件中,我们将调用刚才声明的方法,并传入适当的参数。
以下是点击事件的实现,供您参考。
private void ShowRunDialog(object sender, RoutedEventArgs e)
{
SHRunFileDialog(IntPtr.Zero,
IntPtr.Zero,
"c:\\",
"Run Dialog using PInvoke from Silverlight 5",
"Type the name of a program, folder or internet address
and Windows will open that for you.",
RunFileDialogFlags.CalcDirectory);
}
第一个参数是窗口句柄,第二个参数是图标实例。我们将为这两个参数传递 IntPtr.Zero
,以使用 Windows 提供的默认值。第三个参数接收默认路径;此处我们发送“c:\”作为默认路径。第四个和第五个参数接收 string
来分别表示标题和对话框文本。最后一个参数接收我们最初创建的 RunFileDialogFlags
。此 enum
用于定义“浏览”按钮是否可见,或者您是否需要操作系统根据指定输入计算正确目录。有关此内容的更多信息,请参阅 enum
声明。
演示
现在是时候演示相同的实现了。在浏览器模式下运行 Silverlight 应用程序。在 UI 中,您将看到我们在 XAML 页面中添加的按钮。点击该按钮,Windows 的“运行”对话框就会弹出到屏幕上。在此,您会注意到标题和正文文本与原始“运行”对话框有所不同。这是因为我们传递了自定义文本作为参数。
为了检查“运行”对话框的功能,在名为“打开”的输入框中输入“calc
”(不含引号),然后按“确定”,如下图所示。
这将打开计算器应用程序。您可以像从“运行”对话框一样执行任何操作,因为它就是同一个对话框。那么,今天我们学到了什么?我们了解了使用 Silverlight 5 RC 进行 PInvoke,还学习了如何直接从 Silverlight 应用程序调用“运行”对话框;无论是浏览器内应用程序还是浏览器外应用程序。
结束语
最后但同样重要的是,在构建项目之前,请确保您已将应用程序标记为受信任的,否则您将遇到一些安全例外。默认情况下,“localhost”域在开发目的上是受信任的。您需要更改注册表值以进行开发。要在生产环境中部署,您需要对 XAP 进行签名以获得信任。
您仍然认为“Silverlight 已死”吗?不,我的朋友!Web 仍然需要 Silverlight,并且它似乎有一个非常光明的未来。不要被谣言吓倒。
希望这篇文章有所帮助。关于这个主题还有更多内容即将推出。明天,我们将讨论如何访问系统资源并在 Silverlight 浏览器应用程序中创建“C”驱动器中的目录。所以,请继续关注我的 博客 以阅读相关内容。
历史
- 2011 年 9 月 12 日:初始帖子