Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Узнайте, как запустить приложение по умолчанию для файла из WinUI или другого классического приложения. Многие приложения должны работать с файлами, которые они не могут обрабатывать сами. Например, приложения электронной почты получают различные типы файлов и требуют способа запуска этих файлов в обработчиках по умолчанию. В этих шагах показано, как использовать API среды выполнения Windows.System.Launcher Windows (WinRT) для запуска обработчика по умолчанию для файла, который приложение не может обрабатывать сам.
Важные API
В этом разделе представлены следующие API:
Замечание
Если не указано иное, все API WinRT, используемые в этом разделе, можно использовать как в приложениях WinUI, так и в других классических приложениях. Чтобы узнать больше о том, как сделать ваше настольное приложение совместимым с API WinRT, ознакомьтесь с разделом «Вызов API среды выполнения Windows в настольных приложениях».
Получение объекта файла
Сначала получите объект Windows.Storage.StorageFile для файла.
Если файл включен в пакет для приложения, можно использовать свойство Package.InstalledLocation , чтобы получить объект Windows.Storage.StorageFolder и метод Windows.StorageFolder.GetFileAsync , чтобы получить объект StorageFileAsync .
Если файл находится в известной папке, можно использовать свойства класса Windows.Storage.KnownFolders для получения объекта StorageFolder и метода GetFileAsync.
Запуск файла
Windows предоставляет несколько различных вариантов запуска обработчика по умолчанию для файла. Эти параметры описаны на этой диаграмме и в следующих разделах.
| Опция | Метод | Описание |
|---|---|---|
| Запуск по умолчанию | LaunchFileAsync(IStorageFile) | Запустите указанный файл с обработчиком по умолчанию. |
| Открыть с помощью запуска приложения | LaunchFileAsync(IStorageFile, LauncherOptions) | Запустите указанный файл, позволяющий пользователю выбрать обработчик с помощью диалогового окна "Открыть с помощью". |
| Запуск с помощью рекомендуемого резервного приложения | LaunchFileAsync(IStorageFile, LauncherOptions) | Запустите указанный файл с обработчиком по умолчанию. Если обработчик не установлен в системе, рекомендуется использовать приложение в магазине пользователю. |
| Запуск с заданным остаточным видом | LaunchFileAsync(IStorageFile, LauncherOptions) (только для Windows) | Запустите указанный файл с обработчиком по умолчанию. Укажите предпочтение, чтобы остаться на экране после запуска и запросить определенный размер окна. LauncherOptions.DesiredRemainingView не поддерживается в семействе мобильных устройств. |
Запуск по умолчанию
Вызовите метод Windows.System.Launcher.LaunchFileAsync(IStorageFile), чтобы запустить приложение по умолчанию. В этом примере используется метод Windows.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
}
}
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, чтобы запустить приложение, выбранное пользователем в диалоговом окне Open With.
Рекомендуется использовать диалоговое окно "Открыть с помощью" , если пользователь может выбрать приложение, отличное от значения по умолчанию для определенного файла. Например, если приложение позволяет пользователю запускать файл изображения, обработчик по умолчанию, скорее всего, будет приложением для просмотра. В некоторых случаях пользователю может потребоваться изменить изображение вместо просмотра. Используйте опцию Open With вместе с альтернативной командой в AppBar или в контекстном меню, чтобы разрешить пользователю открыть диалоговое окно Open With и выбрать приложение редактора в этих типах сценариев.
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
}
}
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
}
}
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
}
});
}
Запуск с заданным остаточным видом (только для UWP)
Исходные приложения, вызывающие LaunchFileAsync , могут запросить, что они остаются на экране после запуска файла. По умолчанию Windows пытается совместно использовать все доступное пространство между исходным приложением и целевым приложением, обрабатывающим файл. Исходные приложения могут использовать свойство DesiredRemainingView , чтобы указать операционной системе, что они предпочитают, чтобы их окно приложения занимает больше или меньше доступного места. DesiredRemainingView также можно использовать для указания того, что исходное приложение не должно оставаться на экране после запуска файла и может быть полностью заменено целевым приложением. Это свойство указывает только предпочтительный размер окна вызывающего приложения. Он не указывает поведение других приложений, которые могут также находиться на экране одновременно.
Замечание
Windows учитывает несколько различных факторов, когда он определяет окончательный размер окна исходного приложения, например предпочтения исходного приложения, количество приложений на экране, ориентацию экрана и т. д. Задав 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
}
});
}
Замечания
Приложение не может выбрать запущенное приложение. Пользователь определяет, какое приложение запускается. Пользователь может выбрать приложение WinUI или классическое приложение Windows.
При запуске файла приложение должно быть приложением переднего плана, то есть оно должно быть видимым для пользователя. Это требование помогает гарантировать, что пользователь остается под контролем. Чтобы выполнить это требование, убедитесь, что все файлы запускаются через пользовательский интерфейс вашего приложения. Скорее всего, пользователь всегда должен предпринять некоторые действия для запуска файла.
Невозможно запустить типы файлов, содержащие код или скрипт, если они выполняются автоматически операционной системой, например, .exe, .msiи .js файлами. Это ограничение защищает пользователей от потенциально вредоносных файлов, которые могут изменить операционную систему. Этот метод можно использовать для запуска типов файлов, которые могут содержать скрипт, если они выполняются приложением, которое изолирует скрипт, например, .docx файлы. Приложения, такие как Microsoft Word, сохраняют скрипт в .docx файлах от изменения операционной системы.
Если вы попытаетесь запустить ограниченный тип файла, запуск завершится ошибкой, и обратный вызов ошибки будет вызван. Если приложение обрабатывает множество различных типов файлов и ожидаете, что вы получите эту ошибку, рекомендуется предоставить пользователю резервный интерфейс. Например, вы можете предоставить пользователю возможность сохранить файл на рабочем столе и открыть его там.
Связанный контент
Windows developer