# VBForums CodeBank > CodeBank - Visual Basic .NET >  Get paths to opened files from all processes of Notepad, Wordpad, Excel, and Word

## Peter Porter

The below code works for Microsoft Word, Excel, Notepad, Wordpad, and about any editor where the filename with extension is listed in the title bar.

Windows has a special folder called Recent Items (shortened to Recent in paths), where it logs recently opened and saved files as shortcuts. So what the below code does, after it extracts the filename from a process window, it opens it's shortcut to get the target file path when you click it's ListBox item.

The project is 64bit, using Framework 4.

The COM dlls this project must reference are Microsoft Word 14.0 Object Library, Microsoft Excel 14.0 Object Library, and Microsoft Shell Controls And Automation.

It has a textbox, a listbox, a button, and 3 labels (Label1, FilenameLabel, FilePathLabel).

*30/12/2022*
Forgot about adding the project's zip to this thread. As soon as I'm on my home computer, I'll add it.



```
Option Strict On
Option Explicit On

Imports System.Runtime.InteropServices
Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Interop.Word
Imports Microsoft.Office.Interop.PowerPoint
Imports Shell32

Public Class Form1


    'function gets names of all opened Excel workbooks, adding them to the ListBox
    Public Shared Function ExcelProcess(ByVal strings As String) As String
        Dim Excel As Microsoft.Office.Interop.Excel.Application = CType(Marshal.GetActiveObject("Excel.Application"), Microsoft.Office.Interop.Excel.Application)
        For Each Workbook As Microsoft.Office.Interop.Excel.Workbook In Excel.Workbooks
            Form1.ListBox1.Items.Add(Workbook.Name.ToString() & " - " & Form1.TextBox1.Text)
        Next
        Return strings
    End Function

    'function gets names of all opened Word documents, adding them to the ListBox
    Public Shared Function WordProcess(ByVal strings As String) As String
        Dim Word As Microsoft.Office.Interop.Word.Application = CType(Marshal.GetActiveObject("Word.Application"), Microsoft.Office.Interop.Word.Application)
        For Each Document As Microsoft.Office.Interop.Word.Document In Word.Documents
            Form1.ListBox1.Items.Add(Document.Name.ToString() & " - " & Form1.TextBox1.Text)
        Next
        Return strings
    End Function

    'function gets names of all opened PowerPoint presentations, adding them to the ListBox
    Public Shared Function PowerPointProcess(ByVal strings As String) As String
        Dim PowerPoint As Microsoft.Office.Interop.PowerPoint.Application = CType(Marshal.GetActiveObject("PowerPoint.Application"), Microsoft.Office.Interop.PowerPoint.Application)
        For Each Presentation As Microsoft.Office.Interop.PowerPoint.Presentation In PowerPoint.Presentations
            Form1.ListBox1.Items.Add(Presentation.Name.ToString() & " - " & Form1.TextBox1.Text)
        Next
        Return strings
    End Function


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'clears listbox to prepare for new process items
        ListBox1.Items.Clear()

        'gets process title from TextBox1
        Dim ProcessName As String = TextBox1.Text

        'prepare string's case format for
        ProcessName = ProcessName.ToLower

        'corrects Office process names
        If ProcessName = "microsoft excel" Then
            ProcessName = "excel"
        Else
            If ProcessName = "word" Or ProcessName = "microsoft word" Then
                ProcessName = "winword"
            Else
                If ProcessName = "powerpoint" Or ProcessName = "microsoft powerpoint" Then
                    ProcessName = "powerpnt"
                Else
                End If
            End If

        End If
        'get processes by name (finds only one instance of Excel or Microsoft Word)
        Dim proclist() As Process = Process.GetProcessesByName(ProcessName)

        'adds window titles of all processes to a ListBox
        For Each prs As Process In proclist

            If ProcessName = "excel" Then
                'calls function to add all Excel process instances' workbook names to the ListBox
                ExcelProcess(ProcessName)
            Else
                If ProcessName = "winword" Then
                    'calls function to add all Word process instances' document names to the ListBox
                    WordProcess(ProcessName)
                Else
                    If ProcessName = "powerpnt" Then
                        'calls function to add all Word process instances' document names to the ListBox
                        PowerPointProcess(ProcessName)
                    Else
                        'adds all Notepad or Wordpad process instances' filenames
                        ListBox1.Items.Add(prs.MainWindowTitle)
                    End If
                End If
            End If

        Next
    End Sub


    Private Sub ListBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseClick
        Try
            'add ListBox item (full window title) to string
            Dim ListBoxSelection As String = String.Join(Environment.NewLine, ListBox1.SelectedItems.Cast(Of String).ToArray)

            'get full process title after "-" from ListBoxSelection
            Dim GetProcessTitle As String = ListBoxSelection.Split("-"c).Last()

            'create string to remove from ListBoxSelection
            Dim Remove As String = " - " & GetProcessTitle

            'Extract filename from ListBoxSelection string, minus process full name
            Dim Filename As String = ListBoxSelection.Substring(0, ListBoxSelection.Length - Remove.Length + 1)

            'display filename
            FilenameLabel.Text = "Filename:  " & Filename

            'for every file opened and saved via savefiledialogs and openfiledialogs in editing software
            'Microsoft Windows always creates and modifies shortcuts of them in Recent Items directory:
            'C:\Users\ "Username" \AppData\Roaming\Microsoft\Windows\Recent
            'so the below function gets the target path from files's shortcuts Windows created
            FilePathLabel.Text = "File Path:  " & GetLnkTarget("C:\Users\" & Environment.UserName & "\AppData\Roaming\Microsoft\Windows\Recent\" & Filename & ".lnk")

        Catch ex As Exception
            'no file path to show if nothing was saved yet
            FilePathLabel.Text = "File Path:  Not saved yet."
        End Try

    End Sub


    'gets file's shortcut's target path
    Public Shared Function GetLnkTarget(ByVal lnkPath As String) As String
        Dim shl = New Shell32.Shell()
        lnkPath = System.IO.Path.GetFullPath(lnkPath)
        Dim dir = shl.NameSpace(System.IO.Path.GetDirectoryName(lnkPath))
        Dim itm = dir.Items().Item(System.IO.Path.GetFileName(lnkPath))
        Dim lnk = DirectCast(itm.GetLink, Shell32.ShellLinkObject)
        Return lnk.Target.Path
    End Function

End Class
```


I took the shortest route possible to get this to work. I'm sure it can be done better.

----------


## Peter Porter

Deleted comment

----------

