UWP FullTrustProcess - фактически контролирует процесс - PullRequest
0 голосов
/ 24 октября 2019

В 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.

Представление решения:

enter image description here

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();
}

Так что все это работает нормально, поэтому теперь вопрос в том, как я могу сделать следующие вещи:

  1. Проверить, запущен ли процесс
  2. Закрыть процесс в определенное время изв приложении UWP
  3. Переместите окно в определенную позицию на экране (или используйте другие user32.dll -подобные функции.

Насколько я понимаю, служба приложений в UWP нене похоже на решение, я не могу изменить эксternal .exe таким образом, что бы получить / подключить. Если бы Служба приложений могла использоваться только со стороны UWP для управления процессом, это было бы здорово.

Ответы [ 2 ]

2 голосов
/ 27 октября 2019

Чтобы решить ваш сценарий, вам нужно добавить в свой пакет загрузчик с полным доверием / контроллер EXE. Запустите это из UWP через средство запуска FullTrustProcess и свяжитесь с ним через AppServiceConnection. Из EXE-файла контроллера вы можете использовать все API-интерфейсы System.Diagnostis.Process * для запуска, проверки и уничтожения фактического процесса приложения (в нашем примере Client.exe), а также использовать все функции user32 для манипулирования окнами и т. Д.

Более подробная информация и пример приложения по обработке нескольких процессов здесь: https://stefanwick.com/2018/04/06/uwp-with-desktop-extension-part-2/

Информация и пример того, как осуществлять связь здесь: https://stefanwick.com/2018/04/16/uwp-with-desktop-extension-part-3/

1 голос
/ 25 октября 2019

Чистое приложение UWP запускается в изолированной программной среде, и не может уничтожить процессы, используя тип System.Diagnostics.Process в .NET.

Что вы, вероятно, захотите - это упаковать ваше текущее приложение WPF какUWP, использующий проект Windows Application Packaging.

После этого вы сможете запускать его как приложение с полным доверием, но при этом использовать преимущества оптимизированного развертывания и обновления, предоставляемые UWP, а также использовать современные API-интерфейсы UWP параллельно с вашим текущим.NET код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...