Запуск UWP (Universal Windows Platform) приложения из другой программы — это важный функционал, который может быть полезен в различных сценариях разработки программного обеспечения. В данной статье мы рассмотрим, как реализовать запуск UWP приложения из другого приложения, используя различные подходы и техники.
Что такое UWP приложение?
UWP приложения — это тип приложений, разработанных для платформы Windows 10, которые работают на всех устройствах, поддерживающих эту платформу. Они предоставляют единый интерфейс и опыт использования на компьютерах, планшетах, смартфонах, игровых консолях и других устройствах под управлением Windows 10.
UWP приложения имеют ряд преимуществ, таких как автоматическая масштабируемость для разных устройств, поддержка различных архитектур процессоров и низкая сложность развертывания. Именно поэтому многие разработчики предпочитают использовать UWP приложения при создании программного обеспечения для Windows 10.
Запуск UWP приложения через протокол
Один из способов запуска UWP приложения из другого приложения — использовать протокол. Протокол — это специальная ссылка, которая задает действие для запуска приложения. Для того чтобы использовать этот подход, необходимо выполнить следующие шаги:
Шаг 1: Зарегистрировать протокол для UWP приложения
Для начала, мы должны зарегистрировать протокол для UWP приложения. Это можно сделать в файле Package.appxmanifest, который находится в корне проекта UWP приложения. Добавьте следующий код в этот файл:
<Extensions> <uap:Extension Category="windows.protocol"> <uap:Protocol Name="myapp" /> </uap:Extension> </Extensions>
В данном примере, мы зарегистрировали протокол с именем «myapp». Вы можете задать любое имя протокола в соответствии с вашими потребностями.
Шаг 2: Обработать протокол в UWP приложении
После того, как мы зарегистрировали протокол, необходимо обработать его в UWP приложении. Для этого, вы можете использовать событие Activated в файле App.xaml.cs. Добавьте следующий код:
protected override void OnActivated(IActivatedEventArgs args) { if (args.Kind == ActivationKind.Protocol) { ProtocolActivatedEventArgs protocolArgs = args as ProtocolActivatedEventArgs; string protocol = protocolArgs.Uri.AbsoluteUri; // Обработайте протокол здесь } }
В данном примере, мы обрабатываем протокол в методе OnActivated и получаем URI протокола. Вы можете добавить свою собственную логику обработки протокола в соответствии со своими требованиями.
Шаг 3: Запустите UWP приложение из другого приложения
Теперь, когда мы зарегистрировали протокол и обработали его в UWP приложении, мы можем запустить это приложение из другого приложения. Для этого, используйте следующий код:
Process.Start("myapp://");
В данном примере, мы используем класс Process из пространства имен System.Diagnostics для запуска UWP приложения через протокол «myapp://». Вы можете заменить «myapp» на имя вашего собственного протокола.
Этот подход позволяет запускать UWP приложение из любого приложения, которое поддерживает запуск других программ через протокол.
Запуск UWP приложения через пакетный идентификатор
Еще один способ запуска UWP приложения из другого приложения — использовать пакетный идентификатор. Пакетный идентификатор — это уникальный идентификатор, который присваивается каждому UWP приложению в момент создания. Для того чтобы использовать этот подход, необходимо выполнить следующие шаги:
Шаг 1: Получите пакетный идентификатор UWP приложения
Для начала, мы должны получить пакетный идентификатор UWP приложения. Вы можете найти его в файле Package.appxmanifest. Откройте этот файл и найдите значение атрибута PackageName в следующей строке кода:
<Package ... xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" mp:PhoneIdentity ...>
В данном примере, пакетный идентификатор — это значение атрибута PackageName. Скопируйте это значение, так как оно потребуется в следующих шагах.
Шаг 2: Запустите UWP приложение из другого приложения
Теперь, когда у нас есть пакетный идентификатор UWP приложения, мы можем запустить его из другого приложения. Для этого, используйте следующий код:
Process.Start("explorer.exe", $"shell:AppsFolder\\{packageName}!App");
В данном примере, мы используем класс Process из пространства имен System.Diagnostics для запуска UWP приложения через пакетный идентификатор. Замените «packageName» на значение пакетного идентификатора вашего UWP приложения.
Этот подход позволяет запускать UWP приложение из другого приложения, используя его пакетный идентификатор.
Запуск UWP приложения с передачей параметров
Если вам необходимо передать параметры при запуске UWP приложения, вы можете использовать разные способы для его реализации в зависимости от выбранного подхода.
При использовании подхода с протоколом, параметры могут быть переданы через аргументы протокола. Например, вы можете использовать ссылку «myapp://param1=value1¶m2=value2» для передачи параметров param1 и param2.
При использовании подхода с пакетным идентификатором, параметры могут быть переданы через командную строку. Например, вы можете использовать следующий код для передачи параметров:
Process.Start("explorer.exe", $"shell:AppsFolder\\{packageName}!App {param1} {param2}");
В данном примере, параметры param1 и param2 передаются через командную строку после пакетного идентификатора.
Итоги
В этой статье мы рассмотрели различные подходы и техники для запуска UWP приложения из другого приложения. Мы изучили, как использовать протокол для этой цели, а также как использовать пакетный идентификатор с передачей параметров. Надеемся, что данная информация окажется полезной и поможет вам успешно реализовать запуск UWP приложений в ваших проектах.
You should always avoid using system()
because
- It is resource heavy
- It defeats security — you don’t know you it’s a valid command or does the same thing on every system, you could even start up programs you didn’t intend to start up.
The danger is that when you directly execute a program, it gets the same privileges as your program — meaning that if, for example, you are running as system administrator then the malicious program you just inadvertently executed is also running as system administrator. If that doesn’t scare you silly, check your pulse. - Anti virus programs hate it, your program could get flagged as a virus.
You should use CreateProcess().
You can use Createprocess() to just start up an .exe and creating a new process for it.
The application will run independent from the calling application.
Here’s an example I used in one of my projects:
#include <windows.h>
VOID startup(LPCTSTR lpApplicationName)
{
// additional information
STARTUPINFO si;
PROCESS_INFORMATION pi;
// set the size of the structures
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// start the program up
CreateProcess( lpApplicationName, // the path
argv[1], // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi // Pointer to PROCESS_INFORMATION structure (removed extra parentheses)
);
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
EDIT: The error you are getting is because you need to specify the path of the .exe file not just the name. Openfile.exe probably doesn’t exist.
Для того, чтобы из приложения написанного на c# запустить другое приложение, необходимо использовать класс Process пространства имен System.Diagnostics
using System.Diagnostics;
//создаем новый процесс Process proc = new Process(); //Запускаем Блокнто proc.StartInfo.FileName = @"Notepad.exe"; proc.StartInfo.Arguments=""; proc.Start();
Приведенный выше код, запускает пустой текстовый редактор. Если вы хотите запустить Блокнот с открытым файлом, то необходимо в метод Start передать параметры (например для Блокнота, необходимо передать путь к файлу, который необходимо открыть, для Internert Explorer – адрес URL):
//запускаем блокнот с файлом some.txt Process.Start("Notepad.exe", "some.text"); //запускаем браузер с заданным адресом URL Process.Start("iexplore.exe","csharpcoding.org");
Бывает ситуация, когда нужно запустить другое приложение из своей программы и не дать пользователю возможность закрыть нашу программу:
ProcessStartInfo stInfo = new ProcessStartInfo(@"C:\windows\system32\notepad.exe"); stInfo.UseShellExecute = false; stInfo.CreateNoWindow = true; //создаем новый процесс Process proc = new Process(); proc.StartInfo = stInfo; //Запускаем процесс proc.Start(); //Ждем, пока блокнот запущен proc.WaitForExit(); MessageBox.Show("Код завершения: " + proc.ExitCode, "Завершение Код", MessageBoxButtons.OK, MessageBoxIcon.Information);
Таким образом, пока не будет закрыт блокнот, нашу программу невозможно будет закрыть.
Материал взят из книги Александра Климова “C# советы программистам”
4 / 4 / 0 Регистрация: 10.10.2009 Сообщений: 301 |
|
1 |
|
Запуск другого приложения27.08.2010, 12:24. Показов 19675. Ответов 12
Привет. А подскажите пожалуйста как по нажатию кнопки в Form1 запускать другое виндоусовское приложение Form2?
0 |
Johnny_D Padawan 473 / 323 / 30 Регистрация: 30.01.2010 Сообщений: 1,841 |
||||
27.08.2010, 12:33 |
2 |
|||
0 |
1517 / 641 / 62 Регистрация: 31.03.2009 Сообщений: 2,051 |
|
27.08.2010, 12:35 |
3 |
А подскажите пожалуйста как по нажатию кнопки в Form1 запускать другое виндоусовское приложение Form2? Тебе другое приложение запускать нужно или таки форму вторую открыть?
0 |
Anna502 14 / 14 / 3 Регистрация: 02.07.2010 Сообщений: 99 |
||||
27.08.2010, 12:38 |
4 |
|||
1 |
piloterist 4 / 4 / 0 Регистрация: 10.10.2009 Сообщений: 301 |
||||
27.08.2010, 13:46 [ТС] |
5 |
|||
Ну написаны у меня 2 простенькие программки. Мне надо чтобы из одной можно было вызвать вторую. Добавлено через 1 час 1 минуту
Мне надо не новую создавать а открыть уже существующую. Подскажите =)
0 |
dihlofos Бродяга 314 / 268 / 56 Регистрация: 27.08.2010 Сообщений: 553 |
||||
27.08.2010, 13:51 |
6 |
|||
А чем
не угодил?)
0 |
4 / 4 / 0 Регистрация: 10.10.2009 Сообщений: 301 |
|
27.08.2010, 14:04 [ТС] |
7 |
Error 1 The name ‘Process’ does not exist in the current context это вообще на команду не похоже. И не понятно откуда он путь узнает к экзешнику?
0 |
dihlofos Бродяга 314 / 268 / 56 Регистрация: 27.08.2010 Сообщений: 553 |
||||||||||||
27.08.2010, 14:06 |
8 |
|||||||||||
Вот это попробуй подключить. Если проги в одной папке лежат, то путь можно не указывать, просто:
Ну или путь можно указать:
3 |
4 / 4 / 0 Регистрация: 10.10.2009 Сообщений: 301 |
|
27.08.2010, 14:09 [ТС] |
9 |
Теперь при нажатии на кнопку вылетает ошиба. Подробная информация об использовании оперативной ************** Текст исключения ************** System.ComponentModel.Win32Exception: Не удается найти указанный файл
0 |
IP4ek 2 / 2 / 1 Регистрация: 23.08.2010 Сообщений: 33 |
||||
27.08.2010, 14:16 |
10 |
|||
попробуйте вот так…
ps прописать можно ещё «C:\\work\\progs\\proga.exe» или @»C:\work\progs\proga.exe»
1 |
Бродяга 314 / 268 / 56 Регистрация: 27.08.2010 Сообщений: 553 |
|
27.08.2010, 14:17 |
11 |
«Не удается найти указанный файл» Имя exe-шника правильно указываете?
0 |
piloterist 4 / 4 / 0 Регистрация: 10.10.2009 Сообщений: 301 |
||||||||||||
27.08.2010, 14:26 [ТС] |
12 |
|||||||||||
Вот это попробуй подключить. Если проги в одной папке лежат, то путь можно не указывать, просто:
Ну или путь можно указать:
Указав путь все заработало. Спасибо.
0 |
virtual[ity] 165 / 143 / 66 Регистрация: 05.06.2010 Сообщений: 640 |
||||||||
27.08.2010, 15:32 |
13 |
|||||||
Не знаю всегда пользуюсь
Не когда не выдавало ошибку!
0 |
Written on .
Существует несколько способов запуска одной программы из другой.
1. WinExec — устаревшая функция, используется только для совместимости с 16-битной Windows. Не рекомендуется к использованию в Win32-приложениях.
2. CreateProcess — замена WinExec для Win32.
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
Параметры:
lpApplicationName |
имя программы |
lpCommandLine |
параметры командной строки |
lpProcessAttributes |
атрибуты безопасности процесса (имеет смысл только в NT/2000) |
lpThreadAttributes |
атрибуты безопасности главного потока (имеет смысл только в NT/2000) |
bInheritHandles |
если bInheritHandles == TRUE, то созданный процесс (запущенная программа), наследует дескрипторы (handles) запускающей программы |
dwCreationFlags |
параметры создания. Здесь можно указать класс приоритета создаваемого процесса и некоторые дополнительные параметры |
lpEnvironment |
указатель на блок окружения или NULL, тогда используется блок окружения родителя |
lpCurrentDirectory |
текущая директория или NULL, тогда используется текущая директория родителя |
lpStartupInfo |
указатель на структуру STARTUPINFO, которая определяет положение главного окна |
lpProcessInformation |
сюда будет записана информация о созданном процессе |
Пример запуска notepad.exe.
STARTUPINFO si;
PROCESS_INFORMATION pi;
GetStartupInfo(&si);
if(!CreateProcess(
"c:\\windows\\notepad.exe",
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi)) {
}
Следует обратить внимание на то, что указан полный путь к файлу notepad.exe. CreateProcess не производит поиск файлов в путях, указанных в переменной PATH.
3. ShellExecute и ShellExecuteEx — эти функции предназначены не только для запуска программ, но и для открытия и печати различных документов, т.е. запуска приложений, сопоставленных определенным типам файлов. Если, например, в качестве имени файла указать mydoc.doc, то будет запущено приложение, сопоставленное файлам с расширением doc (Microsoft Word). Функции ShellExecute и ShellExecuteEx в отличие от CreateProcess производят поиск файла в путях, указанных в переменной PATH.
HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
Эта функция возвращает значение >32 в случае успешного выполнения и значение <= 32 в случае ошибки.
Параметры:
hwnd |
дескриптор родительского окна |
lpOperation |
строка, описывающая операцию: «open» — открытие (запуск), «print» — печать, «explore» — открыть окно с заданной папкой |
lpFile |
имя файла |
lpParameters |
параметры командной строки |
lpDirectory |
текущая директория для запускаемой программы |
nShowCmd |
параметр, указывающий, как будет показано приложение при открытии. Имеет тот же смысл, что и nCmdShow в WinMain |
Пример запуска notepad.exe:
if((UINT)ShellExecute(
NULL,
"open",
"notepad.exe",
NULL,
NULL,
SW_SHOWNORMAL) <= 32) {
}
Пример открытия файла doc1.doc.
if((UINT)ShellExecute(
NULL,
"open",
"doc1.doc",
NULL,
NULL,
SW_SHOWNORMAL) <= 32) {
}
WINSHELLAPI BOOL WINAPI ShellExecuteEx(
LPSHELLEXECUTEINFO lpExecInfo
);
Формат структуры SHELLEXECUTEINFO:
typedef struct _SHELLEXECUTEINFO{
DWORD cbSize;
ULONG fMask;
HWND hwnd;
LPCTSTR lpVerb;
LPCTSTR lpFile;
LPCTSTR lpParameters;
LPCTSTR lpDirectory;
int nShow;
HINSTANCE hInstApp;
LPVOID lpIDList;
LPCSTR lpClass;
HKEY hkeyClass;
DWORD dwHotKey;
HANDLE hIcon;
HANDLE hProcess;
} SHELLEXECUTEINFO, FAR *LPSHELLEXECUTEINFO;
Пример запуска notepad.exe:
SHELLEXECUTEINFO SHExecInfo;
ZeroMemory(&SHExecInfo, sizeof(SHExecInfo));
SHExecInfo.cbSize = sizeof(SHExecInfo);
SHExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
SHExecInfo.nShow = SW_SHOWNORMAL;
SHExecInfo.lpFile = "notepad.exe";
if(!ShellExecuteEx(&SHExecInfo)) {
}
4. Функции, предоставляемые стандартной библиотекой языка программирования. Рассмотрение этих функций выходит за рамки данной статьи.