2013-02-07 6 views
5

Ich schreibe eine Screen Capture-Anwendung für einen Client. Der Capture-Teil ist in Ordnung, aber er möchte den Namen und den Pfad der Datei, aus der das Capture besteht, erhalten.Dateiname und Pfad aus einem laufenden Prozess extrahieren

Mit system.diagnostics.process kann ich den Prozess, der die Erfassung ist, abrufen und kann den vollständigen Pfad der EXE abrufen, aber nicht die Datei, die geöffnet ist.

dh. Der Editor ist mit 'TextFile1.txt' als Dokument geöffnet. Ich kann von dem Prozess das MainWindowTitle erhalten, das "TextFile1.txt - Notepad" wäre, aber was ich brauche, ist mehr wie "c: \ users .... \ TextFile1.txt"

Gibt es einen Weg, mehr zu bekommen Informationen aus dem Prozess?

Ich bin sicher, dass es einen Weg gibt, aber ich kann es nicht

Jede Hilfe sehr geschätzt herauszufinden.

Antwort

3

Sie können ManagementObjectSearcher verwenden, um die Befehlszeilenargumente für einen Prozess abzurufen, und in diesem Editorbeispiel können Sie den Dateinamen auslesen. Hier ist eine einfache Konsolenanwendung Beispiel, das aus dem vollständigen Pfad und Dateinamen aller geöffneten Dateien im Notizblock schreibt ..

Imports System 
Imports System.ComponentModel 
Imports System.Management 
Module Module1 
    Sub Main() 
     Dim cl() As String 
     For Each p As Process In Process.GetProcessesByName("notepad") 
      Try 
       Using searcher As New ManagementObjectSearcher("SELECT CommandLine FROM Win32_Process WHERE ProcessId = " & p.Id) 
        For Each mgmtObj As ManagementObject In searcher.Get() 
         cl = mgmtObj.Item("CommandLine").ToString().Split("""") 
         Console.WriteLine(cl(cl.Length - 1)) 
        Next 
       End Using 
      Catch ex As Win32Exception 
       'handle error 
      End Try 
     Next 
     System.Threading.Thread.Sleep(1000000) 
    End Sub 
End Module 

Ich hatte einen Hinweis auf diese spezifische DLL hinzuzufügen:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Managment.dll 
+0

Danke für die Antwort, ich werde es in Kürze testen und melden. –

+0

Das ist ausgezeichnet, genau das, was ich gesucht habe. Vielen Dank. –

1

ich denke, es ist der einfachste Weg

For Each prog As Process In Process.GetProcesses 
    If prog.ProcessName = "notepad" Then 
      ListBox1.Items.Add(prog.ProcessName) 
    End If 
Next 
Verwandte Themen