Возможный подход - минимизировать окно, генерируемое Java.exe
, когда оно появляется, используя UI Automation.
Когда процесс запущен, файл Jar
выполняется и создается новое окно. Это окно имеет специфицированное c имя класса, SunAwtFrame
: это значение можно использовать для идентификации окна, затем получить доступ к элементу автоматизации пользовательского интерфейса WindowPattern и вызвать его SetWindowVisualState () способ свернуть окно.
Вы также можете использовать свойство «Заголовок окна», если его здесь лучше. В этом случае PropertyCondition для идентификации окна - это NameProperty вместо ClassNameProperty :
window = AutomationElement.RootElement.FindFirst(TreeScope.Children, New PropertyCondition(
AutomationElement.NameProperty, "[The Window Title]"))
Конечно, Процесс отлично функционирует.
Здесь я реализовал его, используя асинхронный вариант, перенаправляя StandardOutput и StandardError, а также включая и подписываясь на событие Exited
, устанавливая [Process].EnableRaisingEvents = True
.
События Exited
уведомляют, когда Процесс закрыт, а также удаляет объект Process.
Код здесь использует секундомер, чтобы дождаться появления окна Process ', так как Process.WaitForInputIdle()
может быть не получить его правильно и завершить слишком рано.
Отрегулируйте код, если 3000
миллисекунды слишком короткий или слишком длинный интервал.
Обратите внимание, однако, что как только появляется окно, While
l oop завершается.
Для этого кода требуется ссылка на сборки UIAutomationClient
и UIAutomationTypes
.
Imports System.Windows.Automation
Dim proc As New Process()
Dim psInfo As New ProcessStartInfo() With {
.FileName = "java.exe",
.Arguments = "-jar YourJarFile.jar",
.WorkingDirectory = "[Your Jar File Path]",
.UseShellExecute = False,
.RedirectStandardOutput = True,
.RedirectStandardError = True
}
proc.EnableRaisingEvents = True
proc.StartInfo = psInfo
AddHandler proc.OutputDataReceived,
Sub(o, ev)
Console.WriteLine(ev.Data?.ToString())
End Sub
AddHandler proc.ErrorDataReceived,
Sub(o, ev)
Console.WriteLine(ev.Data?.ToString())
End Sub
AddHandler proc.Exited,
Sub(o, ev)
Console.WriteLine("Process Exited")
proc?.Dispose()
End Sub
proc.Start()
proc.BeginOutputReadLine()
Dim window As AutomationElement = Nothing
Dim sw1 As Stopwatch = New Stopwatch()
sw1.Start()
While True
window = AutomationElement.RootElement.FindFirst(
TreeScope.Children, New PropertyCondition(
AutomationElement.ClassNameProperty, "SunAwtFrame"))
If window IsNot Nothing OrElse sw1.ElapsedMilliseconds > 3000 Then Exit While
End While
sw1.Stop()
If window IsNot Nothing Then
DirectCast(window.GetCurrentPattern(WindowPattern.Pattern), WindowPattern).
SetWindowVisualState(WindowVisualState.Minimized)
End If