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

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

2011年 9月 12日

CPOL

4分钟阅读

viewsIcon

29354

downloadIcon

294

如何直接从 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 的“运行”对话框就会弹出到屏幕上。在此,您会注意到标题和正文文本与原始“运行”对话框有所不同。这是因为我们传递了自定义文本作为参数。

Silverlight 5 RC - PInvoke Demo - Calling Run Dialog from Browser

为了检查“运行”对话框的功能,在名为“打开”的输入框中输入“calc”(不含引号),然后按“确定”,如下图所示。

Silverlight 5 RC - PInvoke Demo - Executing Command from Run Dialog

这将打开计算器应用程序。您可以像从“运行”对话框一样执行任何操作,因为它就是同一个对话框。那么,今天我们学到了什么?我们了解了使用 Silverlight 5 RC 进行 PInvoke,还学习了如何直接从 Silverlight 应用程序调用“运行”对话框;无论是浏览器内应用程序还是浏览器外应用程序。

结束语

最后但同样重要的是,在构建项目之前,请确保您已将应用程序标记为受信任的,否则您将遇到一些安全例外。默认情况下,“localhost”域在开发目的上是受信任的。您需要更改注册表值以进行开发。要在生产环境中部署,您需要对 XAP 进行签名以获得信任。

您仍然认为“Silverlight 已死”吗?不,我的朋友!Web 仍然需要 Silverlight,并且它似乎有一个非常光明的未来。不要被谣言吓倒。

希望这篇文章有所帮助。关于这个主题还有更多内容即将推出。明天,我们将讨论如何访问系统资源并在 Silverlight 浏览器应用程序中创建“C”驱动器中的目录。所以,请继续关注我的 博客 以阅读相关内容。

历史

  • 2011 年 9 月 12 日:初始帖子
© . All rights reserved.