【问题标题】:Process.GetProcessesByName don't work with UWPProcess.GetProcessesByName 不适用于 UWP
【发布时间】:2019-11-02 08:46:57
【问题描述】:

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

我已经在 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)

【问题讨论】:

    标签: c# wpf uwp process runtime-error


    【解决方案1】:

    您需要使用 App Diagnostics 功能运行

    【讨论】:

    • 谢谢,如果我明白了,我可以使用 Windows.System.Launcher 启动一个进程(Windows Store Friendly),但检查进程是否正在运行的唯一方法是使用 Win32(但 WS不是 F)。 (没有其他选择吗?比如 PowerShell 之类的?)
    • 不,我不知道。
    【解决方案2】:
    【解决方案3】:

    @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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-15
      • 1970-01-01
      • 2022-01-08
      • 2020-08-17
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      相关资源
      最近更新 更多