UWP FullTrustProcess - 实际控制进程
UWP FullTrustProcess - actually controlling the process
在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 应用程序中启动和停止该进程it/kill。
所以我经历了创建一个UWP应用程序和一个Package应用程序的过程,我跟着this blog, provided by 。重要的不同是我没有外部 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 应用程序中,我在某处启动 FullTrustProcess
不要忘记转到 Add Reference
-> 通用 Windows -> 扩展 -> Windows Desktop Extensions for the UWP (latest version)
并添加引用
if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", 1, 0))
{
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
}
所以这一切都很好,所以现在的问题是我如何做以下事情:
- 检查进程是否运行
- 在特定时间从 UWP 应用程序中关闭进程
- 将 window 移动到屏幕上的特定位置(或使用其他类似
user32.dll
的功能。
据我了解,UWP 中的 App Service 似乎不是解决方案,我无法以 receive/connect 的方式修改外部 .exe。如果只能从 UWP 端使用应用服务来控制进程,那就太好了。
沙盒中的纯 UWP 应用 运行 并且 不能 使用 .NET 中的 System.Diagnostics.Process
类型终止进程。
您可能想要使用 Windows 应用程序打包项目将当前 WPF 应用程序打包为 UWP。
然后您将能够 运行 它作为一个完全信任的应用程序,但仍然可以利用 UWP 带来的简化部署和更新体验,以及并排使用现代 UWP API使用您当前的 .NET 代码。
要解决您的情况,您需要向您的程序包添加完全信任的 launcher/controller EXE。通过 FullTrustProcess 启动器从 UWP 启动它,并通过 AppServiceConnection 与其通信。然后,您可以从控制器 EXE 使用所有 System.Diagnostis.Process* API 来启动、检查和终止您的实际应用程序进程(在您的示例中为 Client.exe)- 还可以使用所有 user32 函数 window 操纵等
有关处理多个进程的更多信息和示例应用程序:
https://stefanwick.com/2018/04/06/uwp-with-desktop-extension-part-2/
有关如何在此处进行通信的信息和示例:
https://stefanwick.com/2018/04/16/uwp-with-desktop-extension-part-3/
在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 应用程序中启动和停止该进程it/kill。
所以我经历了创建一个UWP应用程序和一个Package应用程序的过程,我跟着this blog, provided by
解决方案视图:
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 应用程序中,我在某处启动 FullTrustProcess
不要忘记转到 Add Reference
-> 通用 Windows -> 扩展 -> Windows Desktop Extensions for the UWP (latest version)
并添加引用
if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", 1, 0))
{
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
}
所以这一切都很好,所以现在的问题是我如何做以下事情:
- 检查进程是否运行
- 在特定时间从 UWP 应用程序中关闭进程
- 将 window 移动到屏幕上的特定位置(或使用其他类似
user32.dll
的功能。
据我了解,UWP 中的 App Service 似乎不是解决方案,我无法以 receive/connect 的方式修改外部 .exe。如果只能从 UWP 端使用应用服务来控制进程,那就太好了。
沙盒中的纯 UWP 应用 运行 并且 不能 使用 .NET 中的 System.Diagnostics.Process
类型终止进程。
您可能想要使用 Windows 应用程序打包项目将当前 WPF 应用程序打包为 UWP。
然后您将能够 运行 它作为一个完全信任的应用程序,但仍然可以利用 UWP 带来的简化部署和更新体验,以及并排使用现代 UWP API使用您当前的 .NET 代码。
要解决您的情况,您需要向您的程序包添加完全信任的 launcher/controller EXE。通过 FullTrustProcess 启动器从 UWP 启动它,并通过 AppServiceConnection 与其通信。然后,您可以从控制器 EXE 使用所有 System.Diagnostis.Process* API 来启动、检查和终止您的实际应用程序进程(在您的示例中为 Client.exe)- 还可以使用所有 user32 函数 window 操纵等
有关处理多个进程的更多信息和示例应用程序: https://stefanwick.com/2018/04/06/uwp-with-desktop-extension-part-2/
有关如何在此处进行通信的信息和示例: https://stefanwick.com/2018/04/16/uwp-with-desktop-extension-part-3/