Results 1 to 2 of 2

Thread: Get paths to opened files from all processes of Notepad, Wordpad, Excel, and Word

  1. #1

    Thread Starter
    Fanatic Member Peter Porter's Avatar
    Join Date
    Jul 2013
    Location
    Germany
    Posts
    539

    Get paths to opened files from all processes of Notepad, Wordpad, Excel, and Word

    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.

    Code:
    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.








    Last edited by Peter Porter; Dec 30th, 2022 at 09:43 AM.

  2. #2

    Thread Starter
    Fanatic Member Peter Porter's Avatar
    Join Date
    Jul 2013
    Location
    Germany
    Posts
    539

    Re: Get paths to opened files from all processes of Notepad, Wordpad, Excel, and Word

    Deleted comment
    Last edited by Peter Porter; Dec 12th, 2022 at 05:28 PM.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width