C# UWP FullTrustProcess-实际控制流程

C# UWP FullTrustProcess-实际控制流程,c#,uwp,process,windows-10,desktop-bridge,C#,Uwp,Process,Windows 10,Desktop Bridge,在WPF中,我使用以下代码控制外部.exe文件的进程: ProcessStartInfo info = new ProcessStartInfo() { Verb = "runas", FileName = executePath,//Client.exe path within the WPF application UseShellExecute = false, RedirectStandardError = true, RedirectStanda

在WPF中,我使用以下代码控制外部.exe文件的进程:

ProcessStartInfo info = new ProcessStartInfo()
{
    Verb = "runas",
    FileName = executePath,//Client.exe path within the WPF application
    UseShellExecute = false,
    RedirectStandardError = true,
    RedirectStandardOutput = true,
};

Process scanProcess = new Process
{
    StartInfo = info,
    EnableRaisingEvents = true
};

int procId = Process.GetCurrentProcess().Id;
Process[] existingProcess = Process.GetProcessesByName("Client.exe");
foreach (Process process in existingProcess)
{
    if (process.Id == procId)
    {
        continue;
    }

    return;//don't run, might have tried to start double
}

scanProcess.Start();
scanProcess.Exited += (s, e) => GoBack();

windowHandle = IntPtr.Zero;
IntPtr buttonHandle = IntPtr.Zero;
while (buttonHandle == IntPtr.Zero)//wait till process is fully started, we wait for a button the be available because then we know it is ready
{
    windowHandle = HardwareApi.GetForegroundWindow();
    buttonHandle = HardwareApi.FindWindowEx(windowHandle, IntPtr.Zero, "TPanel", "Start");

}

Rectangle rect = new Rectangle(0, 0, 0, 0);
HardwareApi.GetWindowRect(windowHandle, ref rect);
//move window to correct position
var tempX = 500;
var tempY = 600;
HardwareApi.SetWindowPos(windowHandle, new IntPtr(-1), 0, 0, 0, 0, 3u);
HardwareApi.MoveWindow(windowHandle, (int)tempX, (int)tempY, rect.Width, rect.Height - 55, true);
正如你所看到的,相当多的过程控制。HardwareApi只是使用DllImport的user32.dll方法的集合

现在我不介意是否所有这些功能都是可能的,但至少我需要能够启动这个过程,并在新的UWP应用程序中停止/杀死它

因此,我经历了创建UWP应用程序和包应用程序的过程,我遵循了,由提供的。重要的不同之处在于,我没有外部Client.exe的单独Visual Studio项目,所以我按照前面提到的答案做了:将Client.exe文件和依赖文件复制到包项目中

解决方案视图:

Package项目的Package.appxmanifest包括以下部分:

  <Applications>
    <Application Id="App"
     ....
      <Extensions>
        <desktop:Extension Category="windows.fullTrustProcess" Executable="Rss\Hardware\Software\RedFolder\Client.exe"/>
      </Extensions>
    </Application>
  </Applications>

  <Capabilities>
    <Capability Name="internetClient" />
    <rescap:Capability Name="runFullTrust" />
   <rescap:Capability Name="allowElevation" />
  </Capabilities>
这一切都很好,现在的问题是我如何做以下事情:

检查进程是否正在运行 在特定时间从UWP应用程序中关闭进程 将窗口移动到屏幕上的某个位置或使用其他类似user32.dll的函数。
据我所知,UWP中的应用程序服务似乎不是一个解决方案,我无法修改外部.exe,使其能够接收/连接。如果应用程序服务只能从UWP端用于控制进程,那就太好了。

纯UWP应用程序在沙箱中运行,无法使用.NET中的System.Diagnostics.process类型终止进程

您可能希望使用Windows应用程序打包项目将当前WPF应用程序打包为UWP


然后,您可以将其作为完全信任的应用程序运行,但仍然可以利用UWP带来的优化部署和更新体验,以及将现代UWP API与当前的.NET代码并行使用。

纯UWP应用程序在沙箱中运行,无法使用.NET中的System.Diagnostics.Process类型终止进程

您可能希望使用Windows应用程序打包项目将当前WPF应用程序打包为UWP


然后,您可以将其作为完全信任应用程序运行,但仍然可以利用UWP带来的优化部署和更新体验,以及将现代UWP API与当前的.NET代码并行使用。

要解决您的方案,您需要向包中添加完全信任启动器/控制器EXE。通过FullTrustProcess launcher从UWP启动,并通过AppServiceConnection与之通信。从controller EXE,您可以使用所有System.Diagnostis.Process*API来启动、检查和终止示例中的实际应用程序Process Client.EXE,还可以使用所有user32函数进行窗口操作等

有关处理多个流程的更多信息和示例应用程序,请参见:

关于如何在此处进行沟通的信息和示例:

要解决您的方案,您需要将完全信任启动器/控制器EXE添加到包中。通过FullTrustProcess launcher从UWP启动,并通过AppServiceConnection与之通信。从controller EXE,您可以使用所有System.Diagnostis.Process*API来启动、检查和终止示例中的实际应用程序Process Client.EXE,还可以使用所有user32函数进行窗口操作等

有关处理多个流程的更多信息和示例应用程序,请参见:

关于如何在此处进行沟通的信息和示例:

这些都不是我的意见或决定。UWP只是WPF,具有一些自动缩放UI的功能,并支持应用类型权限限制因为他们已经停止使用Windows10Mobile,所以使用它的唯一原因是您想针对.NETCore编写WPF风格的程序。Core 3.0不再是Nessery。W10 mobile不是使用UWP的唯一原因,UWP使您能够使用Microsoft分销渠道Windows应用商店,关联驱动程序以自动安装硬件支持的应用程序,fluent design是一个加号,通过web URL打开应用程序,创建良好的支付流,或者使用内置的microsoft工具、性能、公司签名验证,因此在使用硬件时完全受信任,等等。。但是,这又超出了这个问题的范围。是的,我同意WPF似乎在Core 3.0中获得了更多的爱,这有点不幸。@CularBytes:一个纯UWP应用程序在沙箱中运行,不能杀死进程。您可能希望使用Windows应用程序打包项目将当前WPF应用程序打包为UWP。或者你到底想做什么?从WPF到UWP的转换有什么意义?@mm8如果你真的想了解上下文:我们构建了一个UWP应用程序,以实现上述关于硬件的好处,长期的集成将使用.dll与硬件通信,不幸的是,必须创建一个临时解决方案来使用现有的制造商

r软件,需要限制在特定时间内使用。我觉得在沙箱中运行纯UWP很奇怪,但是当使用桥接器时,我可以使用这些进程函数。你可以做的一件事是在你的包中编写一个简单的控制器EXE。通过FullTrustProcess launcher从UWP启动,并通过AppServiceConnection进行通信。从controller EXE,您可以使用所有System.Diagnostis.Process*API启动、检查和终止您的实际应用程序进程,还可以使用所有user32函数进行窗口操作等。这些都不是我的意见或决定。UWP只是WPF,具有一些自动缩放UI的功能,并支持应用类型权限限制因为他们已经停止使用Windows10Mobile,所以使用它的唯一原因是您想针对.NETCore编写WPF风格的程序。Core 3.0不再是Nessery。W10 mobile不是使用UWP的唯一原因,UWP使您能够使用Microsoft分销渠道Windows应用商店,关联驱动程序以自动安装硬件支持的应用程序,fluent design是一个加号,通过web URL打开应用程序,创建良好的支付流,或者使用内置的microsoft工具、性能、公司签名验证,因此在使用硬件时完全受信任,等等。。但是,这又超出了这个问题的范围。是的,我同意WPF似乎在Core 3.0中获得了更多的爱,这有点不幸。@CularBytes:一个纯UWP应用程序在沙箱中运行,不能杀死进程。您可能希望使用Windows应用程序打包项目将当前WPF应用程序打包为UWP。或者你到底想做什么?从WPF到UWP的转换有什么意义?@mm8如果你真的想了解上下文:我们构建了一个UWP应用程序,以实现上述硬件优势,长期的集成将使用.dll与硬件进行通信,不幸的是,必须创建一个临时解决方案来使用现有的制造商软件,这需要限制在特定时间的使用。我觉得在沙箱中运行纯UWP很奇怪,但是当使用桥接器时,我可以使用这些进程函数。你可以做的一件事是在你的包中编写一个简单的控制器EXE。通过FullTrustProcess launcher从UWP启动,并通过AppServiceConnection进行通信。从controller EXE,您可以使用所有System.Diagnostis.Process*API启动、检查和终止实际的应用程序进程,还可以使用所有user32函数进行窗口操作等。返回WPF从来都不是一个选项,但我想我得到了一些东西……这不完全是真的。对于此场景,您不必返回WPF。该应用程序仍然可以是UWP。要解决此问题,请将创建/监视/终止进程的代码移动到FullTrustProcess扩展中。从那以后,您对流程的控制水平与WPF或Win32应用程序相同。有关更多详细信息,请参阅我建议的答案返回WPF从来都不是一个选项,但我想我得到了一些东西……这并不完全正确。对于此场景,您不必返回WPF。该应用程序仍然可以是UWP。要解决此问题,请将创建/监视/终止进程的代码移动到FullTrustProcess扩展中。在这里,您对流程的控制水平与WPF或Win32应用程序相同。有关更多详细信息,请参阅我建议的答案!这正是我最终要做的。创建一个简单的.NET Framework控制台应用程序,按照您描述的操作,然后在项目的属性中将其转换为Windows应用程序,这样就不会显示任何控制台窗口。我目前唯一要解决的问题是:但这超出了这个问题的范围。@CularBytes我建议为此打开一个新的Stackoverflow问题。将问题记录在样本回购协议中可能不会为您解决此问题提供任何帮助。上次检查时,我已不在Windows团队中,提升的进程不支持AppService连接。我的第一个想法是:你真的需要提升Bridge.exe,还是仅仅提升Client.exe?我应该创建一个新问题是的,但也许你这里有解决方案:是的,仅仅提升Client.exe,从Bridge.exe启动进程时,会出现预期错误:请求的操作需要在ProcessStartInfo中使用Verb=runas进行提升。据我所知,我不能让windows为子进程请求提升,尽管UWP在使用和启动Bridge.exe:O UseShellExecute时似乎可以这样做。当然,UseShellExecute为true!谢谢你把我带到那种心态。是的!这正是我最终要做的。创建一个简单的.NET Framework控制台应用程序,按照您描述的操作,然后在项目的属性中将其转换为Windows应用程序,这样就不会显示任何控制台窗口。我目前唯一要解决的问题是:但这超出了这个问题的范围。@CularBytes我建议打开一个新的Stackoverflow问题
这是我的荣幸。将问题记录在样本回购协议中可能不会为您解决此问题提供任何帮助。上次检查时,我已不在Windows团队中,提升的进程不支持AppService连接。我的第一个想法是:你真的需要提升Bridge.exe,还是仅仅提升Client.exe?我应该创建一个新问题是的,但也许你这里有解决方案:是的,仅仅提升Client.exe,从Bridge.exe启动进程时,会出现预期错误:请求的操作需要在ProcessStartInfo中使用Verb=runas进行提升。据我所知,我不能让windows为子进程请求提升,尽管UWP在使用和启动Bridge.exe:O UseShellExecute时似乎可以这样做。当然,UseShellExecute为true!谢谢你把我带到那种心态。
if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", 1, 0))
{
    await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
}