В 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
- это просто набор user32.dll
методов, использующих DllImport
.
Теперь я не против, если не все эти функции возможны, но, по крайней мере, мне нужно иметь возможность запустить процесси остановите / убейте его из нового приложения UWP.
Итак, я прошел процесс создания приложения UWP и приложения Package, следовал за этим блогом , предоставленным этот ответ на stackoverflow . Важным отличием является то, что у меня нет отдельного проекта Visual Studio для внешнего Client.exe, поэтому я сделал то, что сказал упомянутый ответ: скопируйте файл Client.exe (и зависимые файлы) в проект Package.
Представление решения:
Package.appxmanifest проекта Package включает в себя эту часть:
<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
- Переместите окно в определенную позицию на экране (или используйте другие
user32.dll
-подобные функции.
Насколько я понимаю, служба приложений в UWP нене похоже на решение, я не могу изменить эксternal .exe таким образом, что бы получить / подключить. Если бы Служба приложений могла использоваться только со стороны UWP для управления процессом, это было бы здорово.