Benutzer mit den meisten Antworten
Process überwachen

Frage
-
Hallo Experten,
mein Problem ist eine gestarteten Process zu verfolgen. Der folgende Code funzt nicht, da die Events nicht ausgelöst werden, wenn das Programm beendet wird.
Public Class Form1 Dim WithEvents pPPrgProcess As New Process Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load pPPrgProcess.EnableRaisingEvents = True pPPrgProcess.Start("D:\Entwicklung\Icons\m.png") End Sub Private Sub pPPrgProcess_Disposed(sender As Object, e As EventArgs) Handles pPPrgProcess.Disposed Beep() End Sub Private Sub pPPrgProcess_Exited(sender As Object, e As EventArgs) Handles pPPrgProcess.Exited Beep() End Sub End Class
Wo liegt denn mein Denkfehler ?!?
Antworten
-
Hallo Stefan und Roland,
ich habe mal das Problem wie folgt gelöst, was meint Ihr dazu?
Imports System.Threading Imports System.Diagnostics Imports System.ComponentModel Public Class Form1 Dim WithEvents p As New Process Private Declare Function FindExecutable Lib "shell32.dll" Alias _ "FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load StartPrgProcess("D:\Entwicklung\Icons\m.png") End Sub Private Sub StartPrgProcess(FileToStart As String) Dim exe As String= Space(254) & Chr(0) Dim pfadexe As String = IO.Path.GetDirectoryName(FileToStart) Dim datName As String =IO.Path.GetFileName(FileToStart) Dim result As Long
result = FindExecutable(datName, pfadexe, exe) p.StartInfo.FileName = exe.Substring(0, InStr(exe, Chr(32)) - 2).Trim p.StartInfo.Arguments = FileToStart p.StartInfo.WindowStyle = ProcessWindowStyle.Maximized p.EnableRaisingEvents = True p.Start() End Sub Private Sub pPPrgProcess_Disposed(sender As Object, e As EventArgs) Handles p.Disposed p.Dispose() End Sub Private Sub pPPrgProcess_ErrorDataReceived(sender As Object, e As DataReceivedEventArgs) Handles p.ErrorDataReceived p.Dispose() End Sub Private Sub pPPrgProcess_Exited(sender As Object, e As EventArgs) Handles p.Exited p.Dispose() End Sub
- Bearbeitet Monarch-Falter Donnerstag, 12. Oktober 2017 08:20
- Als Antwort markiert Monarch-Falter Donnerstag, 12. Oktober 2017 11:53
Alle Antworten
-
Ich vermute, das der Denkfehler hier liegt:
pPPrgProcess.Start("D:\Entwicklung\Icons\m.png")
"m.png" ist offensichtlich nicht der eigentliche Prozess, sondern lediglich ein Bild, welches mit dem Standardprogramm für PNG's geöffnet wird.
Gruß, Stefan
Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP
-
Hallo Stefan,
denke ich auch, aber mir bzw. dem Prg ist vorher nicht klar was er laden soll und mit welchen Programm. Ergo, bleibt mir nichts anderes übrig, als den Process über die Datei zu starten. Nur wie bekomme ich mit, welchen Programm Windows nun gestartet hat für die jeweilige Datei?
Gruß Monarch
-
Hallo Monarch,
das Problem das Du hast ist dass kein eigener Prozess gestartet wird. Das Bild wird über den Prozess dllHost.exe angezeigt.
Den Prozess findest Du mit
Dim prozesse As Process() = Process.GetProcessesByName("dllhost") Dim p As Process = prozesse(0)
mit p kannst Du jetzt arbeiten. Allerdings must Du beachten dass mit diesem Prozess auch andere Bilder gehändelt werden.
Probieren könntest Du mal folgendes:
Dim prozesse As Process() = Process.GetProcessesByName("dllhost") Dim p As Process = prozesse(0) AddHandler p.Exited, AddressOf pPPrgProcess_Exited Do Until p.HasExited Threading.Thread.Sleep(10) Loop MsgBox("Fertig")
Du könntest Dir z.B. aber auch den Inhalt vonp.MainWindowTitle
ansehen und entsprechend auf Änderungen reagieren.
Grüße
Roland
-
Hallo Stefan und Roland,
ich habe mal das Problem wie folgt gelöst, was meint Ihr dazu?
Imports System.Threading Imports System.Diagnostics Imports System.ComponentModel Public Class Form1 Dim WithEvents p As New Process Private Declare Function FindExecutable Lib "shell32.dll" Alias _ "FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load StartPrgProcess("D:\Entwicklung\Icons\m.png") End Sub Private Sub StartPrgProcess(FileToStart As String) Dim exe As String= Space(254) & Chr(0) Dim pfadexe As String = IO.Path.GetDirectoryName(FileToStart) Dim datName As String =IO.Path.GetFileName(FileToStart) Dim result As Long
result = FindExecutable(datName, pfadexe, exe) p.StartInfo.FileName = exe.Substring(0, InStr(exe, Chr(32)) - 2).Trim p.StartInfo.Arguments = FileToStart p.StartInfo.WindowStyle = ProcessWindowStyle.Maximized p.EnableRaisingEvents = True p.Start() End Sub Private Sub pPPrgProcess_Disposed(sender As Object, e As EventArgs) Handles p.Disposed p.Dispose() End Sub Private Sub pPPrgProcess_ErrorDataReceived(sender As Object, e As DataReceivedEventArgs) Handles p.ErrorDataReceived p.Dispose() End Sub Private Sub pPPrgProcess_Exited(sender As Object, e As EventArgs) Handles p.Exited p.Dispose() End Sub
- Bearbeitet Monarch-Falter Donnerstag, 12. Oktober 2017 08:20
- Als Antwort markiert Monarch-Falter Donnerstag, 12. Oktober 2017 11:53
-
Hallo Monarch-Falter,
du kannst zu jedem Dateityp die Standardanwendung heraus finden, mit der dieser geöffnet wird, sofern eine Zuordnung vorhanden ist. Mit der ermittelten Anwendung kannst Du dann den Prozess starten.
Die Beschreibung zu File Types aus der MSDN gibt dir Aufschluss über die beteiligten Registry Schlüssel, über die du nachsehen kannst, außerdem kannst Du das IQueryAssociations interface nutzen.
- Gruß Florian