Process.GetProcessesByName不适用于UWP

时间:2019-06-19 14:52:43

标签: c# wpf uwp process runtime-error

我只是在尝试恢复某个进程是否正在运行,但是不可能,无论出于何种原因都会重复出现错误... 我不明白,经过研究,我以为我知道这是不可能的,但我不敢相信,如果程序正在运行,一定有一种恢复方法。

我已经在WinForm上使用过Process.GetProcessesByName了,没问题...但是这次使用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 个答案:

答案 0 :(得分:1)

UWP已沙盒化-出于安全原因,不允许这样做。您可以使用Windows.System.Launcher通过URI启动应用程序,仅此而已。

您可以调用Win32 api,但是您的应用程序将无法进入Windows应用商店。

答案 1 :(得分:1)

答案 2 :(得分:0)

@Andy的建议是正确的方向。 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>

请注意:

  

这是restricted capability:如果您将具有此功能的应用程序提交给Windows应用商店,则会触发更严格的审查。该应用程序必须在“开发人员工具”类别中,我们将在批准提交之前检查您的应用程序,以确保它确实是开发人员工具。   在运行时,该功能还会在首次调用任何诊断API时触发用户同意的提示。

     

用户始终处于控制之中:如果权限被拒绝,则API将仅返回有关当前应用程序的信息。该提示仅在首次使用时显示,但用户可以随时通过“设置”中的隐私页面更改主意。    有关更多信息,请参见UWP App Diagnostics

回到您的原始问题,您想找到特定的过程。 首先,您需要通过调用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;
}