Как запустить приложение из другого приложения windows

Запуск 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&param2=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

C#
1
Process.Start("Calc.exe");



0



1517 / 641 / 62

Регистрация: 31.03.2009

Сообщений: 2,051

27.08.2010, 12:35

3

Цитата
Сообщение от piloterist
Посмотреть сообщение

А подскажите пожалуйста как по нажатию кнопки в Form1 запускать другое виндоусовское приложение Form2?

Тебе другое приложение запускать нужно или таки форму вторую открыть?



0



Anna502

14 / 14 / 3

Регистрация: 02.07.2010

Сообщений: 99

27.08.2010, 12:38

4

C#
1
2
3
4
5
   private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.Show();
        }



1



piloterist

4 / 4 / 0

Регистрация: 10.10.2009

Сообщений: 301

27.08.2010, 13:46

 [ТС]

5

Ну написаны у меня 2 простенькие программки. Мне надо чтобы из одной можно было вызвать вторую.

Добавлено через 1 час 1 минуту

Цитата
Сообщение от Anna502
Посмотреть сообщение

C#
1
2
3
4
5
   private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.Show();
        }

Мне надо не новую создавать а открыть уже существующую. Подскажите =)



0



dihlofos

Бродяга

314 / 268 / 56

Регистрация: 27.08.2010

Сообщений: 553

27.08.2010, 13:51

6

А чем

C#
1
Process.Start();

не угодил?)



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

C#
1
using System.Diagnostics;

Вот это попробуй подключить. Если проги в одной папке лежат, то путь можно не указывать, просто:

C#
1
Process.Start("Proga.exe");

Ну или путь можно указать:

C#
1
Process.Start("D:/Work/Progs/Proga.exe");



3



4 / 4 / 0

Регистрация: 10.10.2009

Сообщений: 301

27.08.2010, 14:09

 [ТС]

9

Теперь при нажатии на кнопку вылетает ошиба.

Подробная информация об использовании оперативной
(JIT) отладки вместо данного диалогового
окна содержится в конце этого сообщения.

************** Текст исключения **************

System.ComponentModel.Win32Exception: Не удается найти указанный файл
в System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
в System.Diagnostics.Process.Start()
в System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
в System.Diagnostics.Process.Start(String fileName)
в Model_choice.Form1.button1_Click(Object sender, EventArgs e) в C:\Documents and Settings\USER\Рабочий стол\Model choice\Model choice\Form1.cs:строка 79
в System.Windows.Forms.Control.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ButtonBase.WndProc(Message& m)
в System.Windows.Forms.Button.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)



0



IP4ek

2 / 2 / 1

Регистрация: 23.08.2010

Сообщений: 33

27.08.2010, 14:16

10

попробуйте вот так…

C#
1
2
3
4
5
6
7
8
9
10
11
       
using System.Diagnostics;
 
 Process proc = new Process();
        proc.StartInfo.UseShellExecute = true;
        proc.StartInfo.RedirectStandardOutput = false;
        proc.StartInfo.FileName = @"D:\Work\Progs\Proga.exe";
        proc.StartInfo.Arguments = "параметры";
        proc.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
        proc.Start();
        proc.WaitForExit();

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

Цитата
Сообщение от dihlofos
Посмотреть сообщение

C#
1
using System.Diagnostics;

Вот это попробуй подключить. Если проги в одной папке лежат, то путь можно не указывать, просто:

C#
1
Process.Start("Proga.exe");

Ну или путь можно указать:

C#
1
Process.Start("D:/Work/Progs/Proga.exe");

Указав путь все заработало. Спасибо.



0



virtual[ity]

165 / 143 / 66

Регистрация: 05.06.2010

Сообщений: 640

27.08.2010, 15:32

13

Не знаю всегда пользуюсь

C#
1
using System.Diagnostics
C#
1
Process.Start("proc.exe")

Не когда не выдавало ошибку!



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.                  Функции, предоставляемые стандартной библиотекой языка программирования. Рассмотрение этих функций выходит за рамки данной статьи.

  • Как запустить проверку жесткого диска при загрузке windows 7
  • Как запустить приложение windows на ipad
  • Как запустить программу в windows в консоли
  • Как запустить приложение для windows на маке
  • Как запустить проверку жесткого диска на наличие ошибок windows 10