Откройте другое приложение из текущего - PullRequest
1 голос
/ 11 марта 2019

У нас есть приложение UWP в Магазине Windows. Из этого приложения мы хотели бы запускать различные приложения в одной системе. Для этого процесса нам нужно сделать 2 вещи.

  1. Проверьте, существует ли приложение в системе
  2. Если да, запустите его. Если нет, оставьте отзыв

Мы попробовали несколько вещей, но я ищу лучший способ сделать это. Мы хотели бы запустить как другие приложения UWP, так и автономные приложения.

Я пытался связываться с Unity PlayerPrefs, но это странно. Это работает, если я создаю пользовательский PlayerPref и проверяю, существует ли он из 1 приложения, но как только я делаю playerpref в UWP и проверяю его в автономном режиме, я ничего не получаю. И наоборот, конечно. (Да, я знаю, что UWP сохраняет свои настройки игроков в другом месте)

Каково было бы лучшее общее решение этого? Продолжайте возиться с Playerprefs и искать различные пути в зависимости от приложения, которое мы хотим открыть? (Автономный, UWP) или каким-либо другим способом?

РЕДАКТИРОВАТЬ: Что у меня есть до сих пор:

        if (Input.GetKeyDown(KeyCode.Backspace))
    {
        PlayerPrefs.SetString("42069" , "testing_this");
        PlayerPrefs.Save();
        Debug.Log("Wrote key 42069 to registry with: -value testing_this-");
    }

    if (Input.GetKeyDown(KeyCode.Space))
    {
        if (PlayerPrefs.HasKey("42069"))
        {
            Debug.Log("I found the key 42069 in my registry");
            cube.SetActive(true);
        }
        else
        {
            Debug.Log("I cant find key 42069 in my registry");
        }
    }

    if (Input.GetKeyDown(KeyCode.S))
    {
        const string registry_key = @"SOFTWARE\DefaultCompany";
        using(RegistryKey key = Registry.CurrentUser.OpenSubKey(registry_key))
        {
            if (key != null)
                foreach (string subKeyName in key.GetSubKeyNames())
                {
                    if (subKeyName == "RegistryTesting")
                    {
                        Debug.Log("I found the key on path: " + registry_key);
                    }
                }
        }
    }

РЕДАКТИРОВАТЬ: Никто? Я знаю, что есть способ. Все, что мне нужно сделать, это проверить, существует ли отдельное приложение из приложения UWP. Но у меня нет доступа к реестру в приложении UWP. Я знаю, что есть несколько способов с мостами и т. Д., Но я понятия не имею, как и с чего начать.

1 Ответ

0 голосов
/ 12 марта 2019

Я столкнулся с несколько похожей ситуацией, но я проверял, запущено ли приложение, и если нет, запустите его.В моей ситуации приложение, которое я хотел проверить и запустить, не было чем-то, что я написал, и не было UWP, поэтому мое решение может не сработать для вас, поскольку возможности для этого ограничены.

Сначала добавьте ограниченные возможности вpackage.appxmanifest (code).

xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap mp rescap"

Затем добавьте в приложение возможность «appDiagnostics».

<Capabilities>
<Capability Name="internetClient" />
<rescap:Capability Name="appDiagnostics" />
</Capabilities>

Теперь у вас есть возможность запросить разрешение на доступ к запущенным процессам и проверку.

using System;
using System.Linq;
using System.Threading.Tasks;
using Windows.System;
using Windows.System.Diagnostics;
class ProcessChecker
{
public static async Task<bool> CheckForRunningProcess(string processName)
    {
        //Requests permission for app.
        await AppDiagnosticInfo.RequestAccessAsync();
        //Gets the running processes.
        var processes = ProcessDiagnosticInfo.GetForProcesses();
        //Returns result of searching for process name.
        return processes.Any(processDiagnosticInfo => processDiagnosticInfo.ExecutableFileName.Contains(processName));
    }
}

Запуск приложения / процесса без UWP немного грязный, но возможный.

Во-первых, требуется простое консольное (не UWP) приложение.Замените directoryPath в приведенном ниже коде подходящим путем к каталогу.

using System;
using System.Diagnostics;

namespace Launcher
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                if (args.Length != 3) return;
                string executable = args[2];
                string directoryPath = "C:\\Program Files (x86)\\Arduino\\hardware\\tools\\";
                Process.Start(directoryPath + executable);
            }
            catch (Exception e)
            {
                Console.ReadLine();
            }

        }
    }
}

Создайте консольное приложение и поместите Launcher.exe в папку ресурсов вашего приложения UWP.

Теперь вам нужно добавитьвозможность запускать Launcher и делать это, добавить возможность «runFullTrust» в приложение UWP.

<Capabilities>
<Capability Name="internetClient" />
<rescap:Capability Name="runFullTrust" />
<rescap:Capability Name="appDiagnostics" />
</Capabilities>

Для настольных компьютеров также необходимо добавить возможности рабочего стола и расширение в package.appxmanifest (код).

xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
IgnorableNamespaces="uap mp rescap"

Затем, ниже, в package.appxManifest и внутри.

<Extensions>
    <desktop:Extension Category="windows.fullTrustProcess" Executable="Assets\Launcher.exe" >
      <desktop:FullTrustProcess>
        <desktop:ParameterGroup GroupId="SomeGroup1" Parameters="ProcessName1.exe"/>
        <desktop:ParameterGroup GroupId="SomeGroup2" Parameters="ProcessName2.exe"/>
      </desktop:FullTrustProcess>
    </desktop:Extension>
</Extensions>

Наконец, добавьте ссылки «Расширения рабочего стола Windows для UWP», необходимые для версий вашего приложения.

Теперь вы можете позвонить в Launcher и запустить необходимый процесс.

public static async void LaunchProcess(int groupId)
    {
        switch (groupId)
        {
            case 1:
                await FullTrustProcessLauncher.LaunchFullTrustProcessForAppAsync("SomeGroup1");
                break;
            case 2:
                await FullTrustProcessLauncher.LaunchFullTrustProcessForAppAsync("SomeGroup2");
                break;
        }
    }

Комбинируя вышесказанное, одна из возможностей может быть ...

    public enum ProcessResult
        {
            ProcessAlreadyRunning,
            FailedToLaunch,
            SuccessfulLaunch
        }
    public static async Task<ProcessResult> CheckLaunchCheckProcess1()
        {
            if (await CheckForRunningProcess("ProcessName1.exe")) return ProcessResult.ProcessAlreadyRunning;
            LaunchProcess(1);
            return await CheckForRunningProcess("ProcessName1.exe") ? ProcessResult.SuccessfulLaunch : ProcessResult.FailedToLaunch;
        }

Это всего лишьпример того, как выполнить запуск приложений, не относящихся к uwp, в одном приложении uwp.Для представлений приложений из магазина Windows ограниченные возможности требуют одобрения и могут задержать или остановить развертывание в случае отказа.

Если и вызывающее приложение, и запускающее приложение являются uwp и написаны вами, подходящее решение может использовать URI длясвязь между приложениями, MS doc link Запуск приложения с URI

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...