启动文件的默认应用
重要的 API
了解如何启动文件的默认应用。 许多应用需要处理无法自行处理的文件。 例如,电子邮件应用接收各种文件类型,并且需要一种方法来在其默认处理程序中启动这些文件。 这些步骤演示如何使用 Windows.System.Launcher API 启动应用无法自行处理的文件的默认处理程序。
获取文件对象
首先,获取 文件的 Windows.Storage.StorageFile 对象。
如果该文件包含在应用的包中,则可以使用 Package.InstalledLocation 属性获取 Windows.Storage.StorageFolder 对象和 Windows.Storage.StorageFolder.GetFileAsync 方法以获取 StorageFile 对象。
如果文件位于已知文件夹中,则可以使用 Windows.Storage.KnownFolders 类的属性获取 StorageFolder 和 GetFileAsync 方法以获取 StorageFile 对象。
启动文件
Windows 提供了几种不同的选项,用于启动文件的默认处理程序。 这些选项将在此图表和以下部分进行介绍。
选项 | 方法 | 说明 |
---|---|---|
默认启动 | LaunchFileAsync(IStorageFile) | 使用默认处理程序启动指定的文件。 |
“打开时启动” | LaunchFileAsync(IStorageFile,LauncherOptions) | 启动指定文件,让用户通过“打开方式”对话框选取处理程序。 |
使用建议的应用回退启动 | LaunchFileAsync(IStorageFile,LauncherOptions) | 使用默认处理程序启动指定的文件。 如果未在系统上安装处理程序,建议在应用商店中向用户推荐一个应用。 |
使用所需的剩余视图启动 | LaunchFileAsync(IStorageFile, LauncherOptions) (仅限 Windows) | 使用默认处理程序启动指定的文件。 指定在启动后保留在屏幕上的首选项并请求特定的窗口大小。 移动设备系列不支持 LauncherOptions.DesiredRemainingView 。 |
默认启动
调用 Windows.System.Launcher.LaunchFileAsync(IStorageFile) 方法以启动默认应用。 此示例使用 Windows.Storage.StorageFolder.GetFileAsync 方法启动应用包中包含的映像文件test.png。
async void DefaultLaunch()
{
// Path to the file in the app package to launch
string imageFile = @"images\test.png";
var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile);
if (file != null)
{
// Launch the retrieved file
var success = await Windows.System.Launcher.LaunchFileAsync(file);
if (success)
{
// File launched
}
else
{
// File launch failed
}
}
else
{
// Could not find file
}
}
async Sub DefaultLaunch()
' Path to the file in the app package to launch
Dim imageFile = "images\test.png"
Dim file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile)
If file IsNot Nothing Then
' Launch the retrieved file
Dim success = await Windows.System.Launcher.LaunchFileAsync(file)
If success Then
' File launched
Else
' File launch failed
End If
Else
' Could not find file
End If
End Sub
Windows::Foundation::IAsyncAction MainPage::DefaultLaunch()
{
auto installFolder{ Windows::ApplicationModel::Package::Current().InstalledLocation() };
Windows::Storage::StorageFile file{ co_await installFolder.GetFileAsync(L"images\\test.png") };
if (file)
{
// Launch the retrieved file
bool success = co_await Windows::System::Launcher::LaunchFileAsync(file);
if (success)
{
// File launched
}
else
{
// File launch failed
}
}
else
{
// Could not find file
}
}
void MainPage::DefaultLaunch()
{
auto installFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;
concurrency::task<Windows::Storage::StorageFile^getFileOperation(installFolder->GetFileAsync("images\\test.png"));
getFileOperation.then([](Windows::Storage::StorageFile^ file)
{
if (file != nullptr)
{
// Launch the retrieved file
concurrency::task<bool> launchFileOperation(Windows::System::Launcher::LaunchFileAsync(file));
launchFileOperation.then([](bool success)
{
if (success)
{
// File launched
}
else
{
// File launch failed
}
});
}
else
{
// Could not find file
}
});
}
“打开时启动”
调用 Windows.System.Launcher.LaunchFileAsync(IStorageFile, LauncherOptions) 方法,将 LauncherOptions.DisplayApplicationPicker 设置为 true 以启动用户从“打开方式”对话框中选择的应用。
当用户可能想要选择特定文件的默认应用以外的应用时,建议使用 “打开使用 ”对话框。 例如,如果你的应用允许用户启动图像文件,则默认处理程序可能是查看器应用。 在某些情况下,用户可能需要编辑图像,而不是查看图像。 使用“打开方式”选项以及 AppBar 或上下文菜单中的替代命令,让用户打开“打开方式”对话框,并在这些类型的方案中选择编辑器应用。
async void DefaultLaunch()
{
// Path to the file in the app package to launch
string imageFile = @"images\test.png";
var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile);
if (file != null)
{
// Set the option to show the picker
var options = new Windows.System.LauncherOptions();
options.DisplayApplicationPicker = true;
// Launch the retrieved file
bool success = await Windows.System.Launcher.LaunchFileAsync(file, options);
if (success)
{
// File launched
}
else
{
// File launch failed
}
}
else
{
// Could not find file
}
}
async Sub DefaultLaunch()
' Path to the file in the app package to launch
Dim imageFile = "images\test.png"
Dim file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile)
If file IsNot Nothing Then
' Set the option to show the picker
Dim options = Windows.System.LauncherOptions()
options.DisplayApplicationPicker = True
' Launch the retrieved file
Dim success = await Windows.System.Launcher.LaunchFileAsync(file)
If success Then
' File launched
Else
' File launch failed
End If
Else
' Could not find file
End If
End Sub
Windows::Foundation::IAsyncAction MainPage::DefaultLaunch()
{
auto installFolder{ Windows::ApplicationModel::Package::Current().InstalledLocation() };
Windows::Storage::StorageFile file{ co_await installFolder.GetFileAsync(L"images\\test.png") };
if (file)
{
// Set the option to show the picker
Windows::System::LauncherOptions launchOptions;
launchOptions.DisplayApplicationPicker(true);
// Launch the retrieved file
bool success = co_await Windows::System::Launcher::LaunchFileAsync(file, launchOptions);
if (success)
{
// File launched
}
else
{
// File launch failed
}
}
else
{
// Could not find file
}
}
void MainPage::DefaultLaunch()
{
auto installFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;
concurrency::task<Windows::Storage::StorageFile^> getFileOperation(installFolder->GetFileAsync("images\\test.png"));
getFileOperation.then([](Windows::Storage::StorageFile^ file)
{
if (file != nullptr)
{
// Set the option to show the picker
auto launchOptions = ref new Windows::System::LauncherOptions();
launchOptions->DisplayApplicationPicker = true;
// Launch the retrieved file
concurrency::task<bool> launchFileOperation(Windows::System::Launcher::LaunchFileAsync(file, launchOptions));
launchFileOperation.then([](bool success)
{
if (success)
{
// File launched
}
else
{
// File launch failed
}
});
}
else
{
// Could not find file
}
});
}
使用建议的应用回退启动
在某些情况下,用户可能尚未安装应用来处理要启动的文件。 默认情况下,Windows 将通过向用户提供搜索应用商店中相应应用的链接来处理这些情况。 如果要向用户提供在此方案中获取的应用的特定建议,可以通过传递该建议以及要启动的文件来执行此操作。 为此,请调用 Windows.System.Launcher.launchFileAsync(IStorageFile, LauncherOptions) 方法,将 LauncherOptions.PreferredApplicationPackageFamilyName 设置为要推荐的应用商店中应用的包系列名称。 然后,将 LauncherOptions.PreferredApplicationDisplayName 设置为该应用的名称。 Windows 将使用此信息替换在应用商店中搜索应用的常规选项,并使用特定选项从应用商店中获取推荐的应用。
注意
必须设置这两个选项才能推荐应用。 在没有另一个的情况下设置一个将导致失败。
async void DefaultLaunch()
{
// Path to the file in the app package to launch
string imageFile = @"images\test.contoso";
// Get the image file from the package's image directory
var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile);
if (file != null)
{
// Set the recommended app
var options = new Windows.System.LauncherOptions();
options.PreferredApplicationPackageFamilyName = "Contoso.FileApp_8wknc82po1e";
options.PreferredApplicationDisplayName = "Contoso File App";
// Launch the retrieved file pass in the recommended app
// in case the user has no apps installed to handle the file
bool success = await Windows.System.Launcher.LaunchFileAsync(file, options);
if (success)
{
// File launched
}
else
{
// File launch failed
}
}
else
{
// Could not find file
}
}
async Sub DefaultLaunch()
' Path to the file in the app package to launch
Dim imageFile = "images\test.contoso"
' Get the image file from the package's image directory
Dim file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile)
If file IsNot Nothing Then
' Set the recommended app
Dim options = Windows.System.LauncherOptions()
options.PreferredApplicationPackageFamilyName = "Contoso.FileApp_8wknc82po1e";
options.PreferredApplicationDisplayName = "Contoso File App";
' Launch the retrieved file pass in the recommended app
' in case the user has no apps installed to handle the file
Dim success = await Windows.System.Launcher.LaunchFileAsync(file)
If success Then
' File launched
Else
' File launch failed
End If
Else
' Could not find file
End If
End Sub
Windows::Foundation::IAsyncAction MainPage::DefaultLaunch()
{
auto installFolder{ Windows::ApplicationModel::Package::Current().InstalledLocation() };
Windows::Storage::StorageFile file{ co_await installFolder.GetFileAsync(L"images\\test.png") };
if (file)
{
// Set the recommended app
Windows::System::LauncherOptions launchOptions;
launchOptions.PreferredApplicationPackageFamilyName(L"Contoso.FileApp_8wknc82po1e");
launchOptions.PreferredApplicationDisplayName(L"Contoso File App");
// Launch the retrieved file, and pass in the recommended app
// in case the user has no apps installed to handle the file.
bool success = co_await Windows::System::Launcher::LaunchFileAsync(file, launchOptions);
if (success)
{
// File launched
}
else
{
// File launch failed
}
}
else
{
// Could not find file
}
}
void MainPage::DefaultLaunch()
{
auto installFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;
concurrency::task<Windows::Storage::StorageFile^> getFileOperation(installFolder->GetFileAsync("images\\test.contoso"));
getFileOperation.then([](Windows::Storage::StorageFile^ file)
{
if (file != nullptr)
{
// Set the recommended app
auto launchOptions = ref new Windows::System::LauncherOptions();
launchOptions->PreferredApplicationPackageFamilyName = "Contoso.FileApp_8wknc82po1e";
launchOptions->PreferredApplicationDisplayName = "Contoso File App";
// Launch the retrieved file pass, and in the recommended app
// in case the user has no apps installed to handle the file.
concurrency::task<bool> launchFileOperation(Windows::System::Launcher::LaunchFileAsync(file, launchOptions));
launchFileOperation.then([](bool success)
{
if (success)
{
// File launched
}
else
{
// File launch failed
}
});
}
else
{
// Could not find file
}
});
}
使用所需剩余视图启动(仅限 Windows)
调用 LaunchFileAsync 的源应用可以请求在文件启动后保持屏幕。 默认情况下,Windows 会尝试在源应用和处理文件的目标应用之间平等共享所有可用空间。 源应用可以使用 DesiredRemainingView 属性向操作系统指示,其希望其应用窗口占用更多或更少的可用空间。 DesiredRemainingView 还可用于指示源应用不需要在文件启动后保持屏幕,并且可以完全由目标应用替换。 此属性仅指定调用应用的首选窗口大小。 它不指定可能同时处于屏幕上的其他应用的行为。
注意
Windows 在确定源应用的最终窗口尺寸时会考虑多个不同因素;例如,源应用的首选项、屏幕上的应用数量以及屏幕的方向等。 通过设置 DesiredRemainingView,你无法保证源应用的特定窗口化行为。
**移动设备系列:**LauncherOptions.DesiredRemainingView 在移动设备系列上不受支持。
async void DefaultLaunch()
{
// Path to the file in the app package to launch
string imageFile = @"images\test.png";
var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile);
if (file != null)
{
// Set the desired remaining view
var options = new Windows.System.LauncherOptions();
options.DesiredRemainingView = Windows.UI.ViewManagement.ViewSizePreference.UseLess;
// Launch the retrieved file
bool success = await Windows.System.Launcher.LaunchFileAsync(file, options);
if (success)
{
// File launched
}
else
{
// File launch failed
}
}
else
{
// Could not find file
}
}
Windows::Foundation::IAsyncAction MainPage::DefaultLaunch()
{
auto installFolder{ Windows::ApplicationModel::Package::Current().InstalledLocation() };
Windows::Storage::StorageFile file{ co_await installFolder.GetFileAsync(L"images\\test.png") };
if (file)
{
// Set the desired remaining view.
Windows::System::LauncherOptions launchOptions;
launchOptions.DesiredRemainingView(Windows::UI::ViewManagement::ViewSizePreference::UseLess);
// Launch the retrieved file.
bool success = co_await Windows::System::Launcher::LaunchFileAsync(file, launchOptions);
if (success)
{
// File launched
}
else
{
// File launch failed
}
}
else
{
// Could not find file
}
}
void MainPage::DefaultLaunch()
{
auto installFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;
concurrency::task<Windows::Storage::StorageFile^> getFileOperation(installFolder->GetFileAsync("images\\test.png"));
getFileOperation.then([](Windows::Storage::StorageFile^ file)
{
if (file != nullptr)
{
// Set the desired remaining view.
auto launchOptions = ref new Windows::System::LauncherOptions();
launchOptions->DesiredRemainingView = Windows::UI::ViewManagement::ViewSizePreference::UseLess;
// Launch the retrieved file.
concurrency::task<bool> launchFileOperation(Windows::System::Launcher::LaunchFileAsync(file, launchOptions));
launchFileOperation.then([](bool success)
{
if (success)
{
// File launched
}
else
{
// File launch failed
}
});
}
else
{
// Could not find file
}
});
}
注解
你的应用无法选择启动的应用。 由用户决定要启动的应用。 用户可以选择通用 Windows 平台(UWP)应用或 Windows 桌面应用。
启动文件时,应用必须是前台应用,也就是说,它必须对用户可见。 此要求有助于确保用户保持掌控。 若要满足此要求,请确保将所有文件启动直接绑定到应用的 UI。 很可能,用户必须始终采取一些操作来启动文件启动。
如果操作系统自动执行包含代码或脚本的文件类型,则无法启动文件类型,例如.exe、.msi和.js文件。 此限制可保护用户免受可能修改操作系统的潜在恶意文件的影响。 可以使用此方法启动可包含脚本的文件类型(如果由隔离脚本的应用执行),例如,.docx文件。 Microsoft Word 等应用将脚本保留在.docx文件中,以修改操作系统。
如果尝试启动受限文件类型,启动将失败,并且将调用错误回调。 如果你的应用处理了许多不同类型的文件,并且你期望你遇到此错误,我们建议你为用户提供回退体验。 例如,你可以向用户提供将文件保存到桌面的选项,并且可以在桌面上打开该文件。