Process.GetProcessesByName не работает с UWP - PullRequest
0 голосов
/ 19 июня 2019

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

Я уже использовал Process.GetProcessesByName на WinForm и никаких проблем ... Но на этот раз с UWP у меня ошибка ... Я просто пытаюсьпроверить, работает ли TeamSpeak

public bool isTSOpen()
{
     Process[] processesx64ts = Process.GetProcessesByName("ts3client_win64");
     Process[] processesx32ts = Process.GetProcessesByName("ts3client_win32");
     if(processesx32ts.Length == 0 && processesx64ts.Length == 0)
     {
          return true;
     }
     else
     {
          return false;
      }
}

Получение информации о локальных процессах не поддерживается на этой платформе.

At System.Diagnostics.NtProcessInfoHelper.GetProcessInfos(Predicate'1 machineName)
at System.Diagnostics.Process.GetProcesses(String machineName)
at System.Diagnostics.Process.GetProcessesByName(String processName, String machineName)

Ответы [ 3 ]

1 голос
/ 19 июня 2019

Вы можете использовать appdiagnosticinfo. Я думаю, вам нужно запросить разрешение пользователя в первый раз. https://docs.microsoft.com/en-us/uwp/api/windows.system.appdiagnosticinfo

https://www.google.com/amp/s/blogs.windows.com/buildingapps/2017/06/28/uwp-app-diagnostics/amp/

1 голос
/ 19 июня 2019

UWP находится в «песочнице», и это запрещено по соображениям безопасности.Вы можете запустить приложение по URI, используя Windows.System.Launcher, но это все.

Вы можете вызвать Win32 apis, но тогда ваше приложение не попадет в Магазин Windows.

0 голосов
/ 20 июня 2019

@ Предложения Энди были в правильном направлении.UWP имеет диагностические API, позволяющие приложению перечислять список запущенных приложений, включая приложения UWP, приложения Win32, системные службы и т. Д.

Для успешной работы API необходимо объявить appDiagnostics возможность в вашем манифесте.

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

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

Обратите внимание:

Это ограниченная возможность : если вы отправляете приложение с этой возможностью в WindowsМагазин, это вызовет более пристальное внимание.Приложение должно быть в категории «Инструменты разработчика», и мы проверим ваше приложение, чтобы убедиться, что оно действительно является инструментом разработчика, прежде чем утверждать отправку.Во время выполнения эта функция также запускает запрос согласия пользователя при первом вызове любого из диагностических API.

Пользователь всегда контролирует: если в разрешении отказано, то API будут только возвращать информацию отекущее приложение.Приглашение отображается только при первом использовании, но пользователь может в любое время изменить свое мнение на страницах конфиденциальности в настройках.Для получения дополнительной информации см. Диагностика приложения UWP

Возвращаясь к исходному вопросу, вы хотите найти конкретный процесс.Сначала необходимо запросить разрешение на доступ к диагностике для других приложений, вызвав метод AppDiagnosticInfo.RequestAccessAsync , а затем вы можете ProcessDiagnosticInfo.GetForProcesses метод, чтобы получить все запущенные процессы.В конце вы можете получить конкретный процесс по его свойству ExecutableFileName.

Я сделал простую демонстрационную версию кода для вашей справки:

DiagnosticAccessStatus diagnosticAccessStatus =
await AppDiagnosticInfo.RequestAccessAsync();
switch (diagnosticAccessStatus)
{
    case DiagnosticAccessStatus.Allowed:
         IReadOnlyList<ProcessDiagnosticInfo> processes = ProcessDiagnosticInfo.GetForProcesses();
         var p = processes.Where(x => x.ExecutableFileName == "ts3client_win64.exe"||x.ExecutableFileName == "ts3client_win32.exe").FirstOrDefault();
         if (p!= null)
         {
             //TODO:...
         }
         break;
    case DiagnosticAccessStatus.Limited:
         break;
}
...