我只是在尝试恢复某个进程是否正在运行,但是不可能,无论出于何种原因都会重复出现错误... 我不明白,经过研究,我以为我知道这是不可能的,但我不敢相信,如果程序正在运行,一定有一种恢复方法。
我已经在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)
答案 0 :(得分:1)
UWP已沙盒化-出于安全原因,不允许这样做。您可以使用Windows.System.Launcher
通过URI启动应用程序,仅此而已。
您可以调用Win32 api,但是您的应用程序将无法进入Windows应用商店。
答案 1 :(得分:1)
您可以使用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/
答案 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;
}