Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extracting Filename and Path from a running process

I'm writing a screen capture application for a client. The capture part is fine, but he wants to get the name and path of the file that the capture is of.

Using system.diagnostics.process I am able to get the process that the capture is of, and can get the full path of the EXE, but not the file that is open.

ie. Notepad is open with 'TextFile1.txt' as its document. I can get from the process the MainWindowTitle which would be 'TextFile1.txt - Notepad' but what I need is more like 'c:\users....\TextFile1.txt'

Is there a way of getting more information from the process?

I'm sure there is a way, but I can't figure it out

Any help greatly appreciated.

like image 616
Richard Harrison Avatar asked Oct 05 '22 02:10

Richard Harrison


2 Answers

You can use ManagementObjectSearcher to get the command line arguments for a process, and in this notepad example, you can parse out the file name. Here's a simple console app example that writes out the full path and file name of all open files in notepad..

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

I had to add a reference to this specific dll:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Managment.dll
like image 169
flipgish Avatar answered Oct 13 '22 11:10

flipgish


i think it is the simplest way

For Each prog As Process In Process.GetProcesses
    If prog.ProcessName = "notepad" Then
          ListBox1.Items.Add(prog.ProcessName)
     End If
Next
like image 32
TOM Avatar answered Oct 13 '22 11:10

TOM