Out-Notepad: Send Information to Notepad

by Jun 8, 2018

Have you ever wanted to send text directly to Notepad, without having to use a file?

Typically, you would need to write the text to a file, then open Notepad and instruct it to load the file. There is also a more exotic way: communicate with Notepad via Windows messages, and beam text right into Notepad. This is what Out-Notepad does:

#requires -Version 2
function Out-Notepad
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)]

    $sb = New-Object System.Text.StringBuilder

    $null = $sb.AppendLine($Text)
    $text = $sb.ToString()

    $process = Start-Process notepad -PassThru
    $null = $process.WaitForInputIdle()

    $sig = '
      [DllImport("user32.dll", EntryPoint = "FindWindowEx")]public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow)
      [DllImport("User32.dll")]public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam)

    $type = Add-Type -MemberDefinition $sig -Name APISendMessage -PassThru
    $hwnd = $process.MainWindowHandle
    [IntPtr]$child = $type::FindWindowEx($hwnd, [IntPtr]::Zero, "Edit", $null)
    $null = $type::SendMessage($child, 0x000C, 0, $text)

And this is how you can use it:

PS> Get-Service | Out-Notepad

PS> Get-Service | Out-String | Out-Notepad 

With both commands, a fresh Notepad instance opens, and all services are written to Notepad. Note the difference, though: the first line produces a list of object names. If you want the objects to be displayed just as rich as they would inside of PowerShell, make sure you pipe them to Out-String before you pipe them to Notepad.

Twitter This Tip! ReTweet this Tip!