Я ищу способ выполнить Steam (Steam.exe) и дождаться его загрузки (не выйти).Выполнение приложения и ожидание его загрузки
Я подумал, что хорошая идея - перечислить все дочерние дескрипторы и найти строку в заголовках, потому что когда паровые нагрузки существуют дескриптор окна с именем «Друзья», но это сложно сделать для меня (API) так что, возможно существует простой способ, чтобы ждать программа для загрузки ...
пример того, что я буду делать:
' First process
Process.start("Process 1.exe")
' Here will goes an efficient method to wait for application is loaded,
' not sleeping X seconds measuring the loading time or any of that.
' Second process
' Depends on first process fully loaded.
' If first process is not fully loaded (libraries and that) then this process can't run.
Process.start("Processs 2.exe")
UPDATE:
Главный вопрос заключается в том, чтобы ждать, пока процесс X должен быть загружен, но о Steam.exe я заметил тоже, когда пара загружается пытается читать/открыть некоторые REGKEYS:
http://img267.imageshack.us/img267/6599/prtscrcapture4u.jpg
Может быть, я могу сделать что-то с кодом для мониторинга, если один из этих RegKeys будет принят?
Нечто подобное ?:
Dim RegKey = "HKLM\...blablabla"
Process.start("steam.exe")
While not Regkey.IsAccessed
' Do nothing and wait
Loop
Process.start("Second process.exe")
UPDATE 2:
Я пытаюсь сделать функцию, принимая по ссылке решение Amegon, я не закончил код потому что я получаю сообщение об ошибке в строке:
Memory = hprocess.PrivateMemorySize64
Но я получаю сообщение об ошибке при попытке запустить «большое» приложение (приложение, которое требует много времени для загрузки, например, Photoshop), при этом «маленькие» приложения работают хорошо.
Пожалуйста, если кто-то может помочь мне упростить/улучшить решение Amegon, чтобы создать универсальную функцию и исправить ошибку переполнения памяти ... Спасибо!
Это мой код:
' This is the sub that launchs the unfinished function:
Private Sub Launch_Game()
'Wait_For_Application_To_Load("C:\Games\Steam.exe", "-applaunch 0")
Wait_For_Application_To_Load("C:\Program Files\Adobe Photoshop CS6 (64 Bit)\Photoshop.exe")
End Sub
Private Function Wait_For_Application_To_Load(ByVal APP_Path As String, Optional ByVal APP_Arguments As String = Nothing)
Dim File = My.Computer.FileSystem.GetFileInfo(APP_Path)
Process.Start(APP_Path, APP_Arguments)
Timer_CheckCPU.Tag = File.Name.Substring(0, File.Name.Length - 4) ' Photoshop
Timer_CheckCPU.Enabled = True
End Function
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByVal lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer
Private WithEvents Timer_CheckCPU As New Timer
Dim Memory_Value_Changed As Boolean
Dim CPU_Changed As Boolean
Dim CPU_Time As Boolean
Dim Running_Time As Boolean
Private _desiredTime_ms As Integer = 1500
Private Sub Timer_CheckCPU_Tick(sender As Object, ev As EventArgs) Handles Timer_CheckCPU.Tick
Timer_CheckCPU.Enabled = False
Dim pProcess() As Process = System.Diagnostics.Process.GetProcessesByName(Timer_CheckCPU.Tag)
Dim hprocess As Process = pProcess(0)
If hprocess Is Nothing Then
Running = False
Timer_CheckCPU.Enabled = True
Return
End If
Running = True
' Here is the error:
Memory = hprocess.PrivateMemorySize64
' MsgBox(hprocess.PrivateMemorySize64.ToString)
CPUTotal = hprocess.TotalProcessorTime.TotalMilliseconds
If AllConditionsGood() Then
If Not (_countdown.IsRunning) Then
_countdown.Reset()
_countdown.Start()
End If
Dim _elapsed As Integer = _countdown.ElapsedMilliseconds
If _elapsed >= _desiredTime_ms Then
Me.TopMost = True
MsgBox("process loaded")
Return
End If
Else
_countdown.Reset()
End If
Timer_CheckCPU.Enabled = True
End Sub
Private Function AllConditionsGood() As Boolean
If CPU_Time Then Return False
If Memory_Value_Changed Then Return False
If Running_Time Then Return False
Return True
End Function
Private _countdown As New Stopwatch
Private _Running As Boolean = False
Public WriteOnly Property Running() As Boolean
Set(ByVal value As Boolean)
_Running = value
If value Then
Running_Time = False
Else
Running_Time = True
End If
End Set
End Property
Private _CPUTotal As Integer
Public WriteOnly Property CPUTotal() As Integer
Set(ByVal value As Integer)
CPU = value - _CPUTotal 'used cputime since last check
_CPUTotal = value
End Set
End Property
Private _CPU As Integer
Public WriteOnly Property CPU() As Integer
Set(ByVal value As Integer)
If value = 0 Then
CPU_Time = False
Else
CPU_Time = True
End If
_CPU = value
End Set
End Property
Private _Memory As Integer
Public WriteOnly Property Memory() As Integer
Set(ByVal value As Integer)
MemoryDiff = Math.Abs(value - _Memory)
_Memory = value
End Set
End Property
Private _MemoryDiff As Integer
Public WriteOnly Property MemoryDiff() As Integer
Set(ByVal value As Integer)
If value = _MemoryDiff Then
Memory_Value_Changed = False
Else
Memory_Value_Changed = True
End If
_MemoryDiff = value
End Set
End Property
Вы проверили метод [GetProcessesByName] (http://msdn.microsoft.com/en-us/library/z3w4xdc9.aspx) класса Process? Просто попробуйте с помощью инструмента ProcessExplorer определить имя процесса ..... – Steve
И что вы видите, если вы нажмете кнопку «Процесс»? Вы ищете процесс, а не окна – Steve
Простите, что это мой первый раз, когда я использовал spy ++, я отредактировал мой вопрос! – ElektroStudios