Ste
Ste

Reputation: 2293

OpenFileDialog in PowerShell - Can the icon of the dialog be changed?

I have this code that will invoke the OpenFileDialog class.

There doesn't seem to be a property to change the icon of the dialog that's shown at the top left corner of the dialog.

Is there a way to hack a change this?

Here's the code:

Function Invoke-OpenFileDialog {

  Param (
    [Parameter(Mandatory=$true, Position=0)] [string] $Title,
    [Parameter(Mandatory=$true, Position=1)] [string] $InitialDirectory,
    [Parameter(Mandatory=$true, Position=2)] [string] $Filter
    )

  Add-Type -AssemblyName System.Windows.Forms

  if ($InitialDirectory -ne "") {
    if (!(Test-Path -LiteralPath $InitialDirectory -PathType Container)) {
      $InitialDirectory = ([System.IO.FileInfo]$InitialDirectory).DirectoryName
    }
  }

  $OpenFileDialog                  = New-Object System.Windows.Forms.OpenFileDialog
  $OpenFileDialog.Filter           = $Filter
  $OpenFileDialog.InitialDirectory = $InitialDirectory
  $OpenFileDialog.Title            = $Title
  $result                          = $OpenFileDialog.ShowDialog()
  $OpenFileDialog.Dispose()

  if ($result -eq 'OK') {
    return $OpenFileDialog.FileName
  }
  else { return "" }

}

$title = 'OpenFileDialog Title'
$initialDirectory = ([System.IO.FileInfo]"C:\Users\").DirectoryName
$filter = 'All files (*.*)| *.*'

$filePicked = Invoke-OpenFileDialog -Title $title -InitialDirectory $initialDirectory -Filter $filter

# Then use this to check if the picker has done its job.
if ($filePicked -ne "") {
  $filePicked
  Write-Host 'File Picked...'
}
else {
  Write-Host 'File Not Picked...'
}

The icon in question:

enter image description here

Upvotes: 2

Views: 1186

Answers (2)

Ste
Ste

Reputation: 2293

I found a way to set the icon independently from any UI by setting up:

$OpenFileDialogForm = New-Object System.Windows.Forms.Form

and passing a base64 string to the icon property of the $OpenFileDialogForm.

Then pass the $OpenFileDialogForm to:

$userClicked = $OpenFileDialog.ShowDialog($OpenFileDialogForm),

Some comments in the Invoke-OpenFileDialog function explaining this.

The IconBase64 parameter in the function is where this can be set.

Here's the code for this:

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

Function Get-LastValidDirectory {

  Param
  (
    [Parameter(Mandatory = $true, HelpMessage = 'The literal path where the folder you want to check is, which will return the last valid folder.')]
    [Array]$LiteralPath
    )

  if (Test-Path -LiteralPath $LiteralPath -PathType Container) {
    # Returns the path passed to the function if it has been found.'
    return $LiteralPath
  }

  # Increment the input folder
  $lastDir = Split-Path -LiteralPath $LiteralPath

  # Test that folder for it not existing and check if it's doesn't exist and in the
  # while loop increment the $lastDir variable.
  while (!(Test-Path -LiteralPath $lastDir -PathType Container)) {
    $lastDir = Split-Path -LiteralPath $lastDir
  }

  return $lastDir

}

function Invoke-OpenFileDialog {

  Param (
    [Parameter(Mandatory=$true, Position=0)] [string] $Title,
    [Parameter(Mandatory=$true, Position=1)] [string] $InitialDirectory,
    [Parameter(Mandatory=$true, Position=2)] [string] $Filter,
    [Parameter(Mandatory=$true, Position=3)] [string] $IconBase64,
    [Parameter(Mandatory=$true, Position=4)] [boolean] $TopMost
    )

  if ($InitialDirectory -ne "") {
    if (!(Test-Path -LiteralPath $InitialDirectory -PathType Container)) {
      $InitialDirectory = ([System.IO.FileInfo]$InitialDirectory).DirectoryName
    }
  }

  # Create a streaming image by streaming the base64 string to a bitmap stream source.

  $IconBase64 = $IconBase64
  $iconBytes  = [Convert]::FromBase64String($IconBase64)
  $stream     = New-Object IO.MemoryStream($iconBytes, 0, $iconBytes.Length)
  $stream.Write($iconBytes, 0, $iconBytes.Length)

  # Create a new form to hold the object and set it properties for the main
  # OpenFileDialog form.

  $OpenFileDialogForm         = New-Object System.Windows.Forms.Form
  $OpenFileDialogForm.Icon    = [System.Drawing.Icon]::FromHandle((New-Object System.Drawing.Bitmap -Argument $stream).GetHIcon())
  $OpenFileDialogForm.TopMost = $TopMost

  # Set the properties of the main OpenFileDialog along with using the
  # OpenFileDialogForm properties from above.

  $OpenFileDialog                  = New-Object System.Windows.Forms.OpenFileDialog
  $OpenFileDialog.Filter           = $Filter
  $OpenFileDialog.InitialDirectory = $InitialDirectory
  $OpenFileDialog.Title            = $Title
  $userClicked                     = $OpenFileDialog.ShowDialog($OpenFileDialogForm)
  $OpenFileDialog.Dispose()

  if ($userClicked -eq 'OK') { return $OpenFileDialog.FileName } else { return "" }

}

$title = 'OpenFileDialog Title'
$initialDirectory = ([System.IO.FileInfo]"C:\Users\").DirectoryName + '\no folder here'
$filter = 'Application (*.exe)|*.exe|SpreadSheet (*.xlsx)|*.xlsx'
$filter = 'All files (*.*)| *.*'
$iconBase64OpenFileDialog = "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGkmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTEyLTI2VDIxOjQxOjA0WiIgeG1wOk1vZGlmeURhdGU9IjIwMjAtMTItMjZUMjE6NDc6MjZaIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIwLTEyLTI2VDIxOjQ3OjI2WiIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpkODAwODQwYy0yN2JiLTI3NDItYjVjOS0yNjY5NjI4ZjE1NGEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6N2Y4MTY1YTYtZmVkYi02MDRkLThkNjgtYjM3YjBiN2RmMWRlIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6N2Y4MTY1YTYtZmVkYi02MDRkLThkNjgtYjM3YjBiN2RmMWRlIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo3ZjgxNjVhNi1mZWRiLTYwNGQtOGQ2OC1iMzdiMGI3ZGYxZGUiIHN0RXZ0OndoZW49IjIwMjAtMTItMjZUMjE6NDE6MDRaIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmJhODk5YWVjLTA4ZDAtYjQ0Yi1hYzU3LWM0NGFmZGU1MDY1MiIgc3RFdnQ6d2hlbj0iMjAyMC0xMi0yNlQyMTo0Njo0MloiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMS4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZDgwMDg0MGMtMjdiYi0yNzQyLWI1YzktMjY2OTYyOGYxNTRhIiBzdEV2dDp3aGVuPSIyMDIwLTEyLTI2VDIxOjQ3OjI2WiIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjkLPFQAABG3SURBVHic5Zt7rGxXXcc/a7/fM3NrkVeqlaZiMZYmJQKlBQ3gjaEGFLC1EQxIytwSjETTVGnQopRgRbFwjmkMpErFSI1EoAETCC3lYgivNAgoFFOQV3pve87M7DOzZz+Wf8z+bdbMmTnn3NtLSOSXrJyTM2vWWr/v+r1/6yitNT/O5MgvSqkf5Rl+HrgSeALgAwXwJeB+4JvnekPz0p0D5p0RBUGAUgrbtrEsC601ZVli2zZVVaGU6obWmul0+gTgMuDDlmVh2zZKqe67dV3TNA1N01wex/HnXNdFKcVsNmM6nZ6rY587AA6j2Wz2S8DVwEXAxUqpnxWwhHEhkcYWvM/meX4PsD0YDD50rs+lRBweqwqsk4DxeOwALweutCzrtY7jILctVNc1WmuqqkJr3YmnZVk4joPjODRNQ1EUNE3zpjAMb3msEmCqwDkHYDqdvgQYApcCj3McB9u2MfcRZpum+SrwX8DXgE+1P78PKODngGcrpW51XZcgCJjNZszn8xuBbWB8tmf9oQAAvAIYOo7zTM/zuluuqkpu73ZgBnwHeBB4KE3TB+q67hYQdRBJ8DyPRx999HJgaNv2q3zfpyxLyrK8EXjb2R70hwHAllJqGIYhjuNQliUAZVlSVdV/ANtBEPy9bds4jsN8PgfAcRw2AaCUwvO8DsDZbHYD8M4gCKiqiqqqrndd9w7Z60zoXAOwBQyzLENrzWQyQWv9IPB14G7f9//ONGqHASDqUhRFN78sS5RS7O3tXQoMXde9vrUbzwPuPdMDL8U+puE5C7oR0FmW6SiKNAvf/cowDImiiDAM8X2fIAgIgoA4jun1eoRhSBiGpGlKFEVEUUSSJGRZRhRFOI7TAZJlGWmaEscxcRyTpinA7VEUacuyNIsLOGMAZFiHT99ILwSGvV4Px3HY29sD2E7T9M4zkSZxgXVds7e3x97eHlVVAXSuUWvd2ZRW5CdVVQkYQ+B3z5aJs1WB84E7wjB8sed5jEYjtNbbwAkxgKLLTdOwSQVc16UsS+bz+ZIqGPSTwK8BFwJz4EOu6362LMsLgIeyLKNpGiaTyeeBN3BEdTgXKrDlOI4eDAbacZwlMbRtm6OoQBzHZFmGAOY4Dq7rdgO4TimlPc/Tnudp3/dF5N8HXAVsWZal+/2+9jxPA//EIqQ+EgAd32cBwJbrurrX62nbtjULD7A0wfM84jgmDEM8z8P3fcIwJEkS+v0+cRwvMet53r4B3B9Fkc6yTKdpqsMw1HEca9/3NYsc4Trgg3EcmzZoC7A5hB4LAFuWZeljx46ZGy7ZEblxMXS+7xNFEZ7nEYZhd+uH7aOU6hhrb/79gI6iSIdhKCBco5TSApRI4zpADWDPGoC3KKV0mqY6CAINfAx4qnzoui5pmtLv9zvxFwufpmlnxA6yNe1nN7HsWTRwA4vI8G/kDHEcaxY6f43jODoIAp1lmVZKaSA+duwY68bZAnA98Gi/39f9fl+zSFFfCgtL7Xlex3yapt3tCxBJknSu7RDmrwd0kiQi6h8GXtTahC3P83SSJDpNU51lmXZdVwP3imoEQSB/+wPf91k3VgE46FTnAQmLmH4YBEG/aRpGoxEsYvG7HcfB9/0ufX0s0aTW+qXA3yZJQl3XFEXxz8B2GIafmE6nFymlhkEQLDEQRRF5nl+V5zlRFAHQNA3Ak4667xIAcRwDkOf5eUqpU+1mHwnD8FLf99nZ2RHmb3VdlyiKqKqKuq6XMryzoMcDwzAMqeua6XT6buC2KIq+4jgO0+n0EjOhEmqahiAIyPOcoihIkkTmPO2odm0JgBY9gBiQdPS467qMx2NYMH9CLLvWmjzPY+BXgZ9m4bcrFpndx6Io2lvdUDI7Yy/yPB96nvfLbbj7LWBbKfUVY86D5nzzvPP5nF6vx87OziTP8ySKIqbT6Qvm8/njsyz73up3JAbpyLQBkroCA1pd7PV6nXVVSuE4Dr1eDxY+912Atm1bu66rgyDQvu+LexQvcYlpA2zbXjVKLq3Ra/e5STxJFEVdCEzrgXzf12EY6iiKxBh/0fd9sRnfTZJE7MAtUk8wh8nzPiMoAQtwreM4utfriVXtfH1rkN4O6CAIdBiG2vd97XleB4L4bt/35ftvM42gGfQAzxRXBnxdDKjpQpMkER1/erv3R4FPA38BXK+U6s5qWZas9TCL6tM+2giA7/v0+32A++I41kmSaED7vm8auL+2bVsnSaKDIBAf/S7gj4BbWNT4dJIkOssyHcex3MimpOU5tP4d+B+5BBkmAOJS4zgmSZLO8wAn0zSVfR4aDAbdnqvrHQgAcAxIAZ2mqU7TVETZbl3IX0mA0orcfcC1WZZ1mVx7U7fKvDRNTUn6FdnI8zySJIFFFVgbontjv99HhkSUqwCYGSLwatd1JUA67TiOTtNU9vzN888/HxmrAJhR3BOB08BIqret4flamqZ1G0UNkyTpanQs0t8HJpMJRVF0hQzf92/SWr9lPB6jlKIoCsIwRCn1EeBq27ZpmgbLsuj3+wXwJ1VViY4Od3Z2+pPJhDzPu4py0zTLhQylqOtajNonq6oSlTom32kvYzibzZCxjwwJeLNt250REx0G7mhF57ccx+lu1QhElhKhJEnMCu+W67paVKZNWu4RdZIgqpW8hwwp2EqShMFg0IXVQRCQJMmSNIgaAMeUUjpJElHJTwdBYEretet4XpUAT0RTkG3z8s+3knCtaci01sRxjGVZQ+C453lYlkVZlt1N2bZ9oizLVzRNY6a7tVn5aW/wEWA7z/NuzclksiV1AbnxDRcH8Hiz5wB8WvoKrRT8I3DVukDNBCA3awNS2gY+2N7ohWbtXg7R0pNlQwmKpCbged4/aK3vhy7O+IxkgK3ICr1Va709Ho9J0xTP84bj8fi+2Wx27XQ6PSx7GgZBIOB/FDhpltpbCR6uS8L2hcISXbVdmXcnSfLt9iYqc57oYAvC3dK5qeu6u+32ht+olHqO7/uig9sSNUrN37jpE3VdM5lMhm3scGVRFFe20eH7gFMsKsp5e/YnAc91XfdK27a7qhTwoaqqkCpyexnXFEXxehbu8QdkiNIbxH0lSSLBzG84jiNidKf4eCPp0MDrRRdX9B/gYuDbURSJPbm91+vR6/XIsox+v78qBUJvl2KIGWv4vq8dx+mG53k6jmMdx7Ho+s2ABHMfD4KgK6i0HuKNJs+rbvDVlmV1vrtd8FiapmKdr1BKSRp6CngdECRJ0vnl1q2ZtOV5nu71eppFT+CSddyuUutynwq8A7jfsiztOE6X8QkYxkV8CbhB7EAL6sssy+qKKO28u1YBMFWgEcPUjpNZlj0i7se27U/Vdf3uqqpeZVnWeU3T3BcEwayqqqVESAxlVVVblmUNoyhid3cXFqL55aMAADAYDL46m81+D2A6nV7WNM0zqqq6kIWxViwqPxGL1Hw7DMNT0+kUQ73eX1XVN7TWPyPl97Is9yUUJgAdF60OPzidTlFKdVniaDSqDUv7/Pl8/oBEV7CwH67rMp1Ot2zbHqZpahZMf/+ozK9SGIZfUEp9wbQzEnOYXgfoCrEt3VOW5euiKJI5+9Jka/V3QyX+W2J2KWICP+X7vvjuYdM0T3Ndd+kAwnybldE0zTZw4myZPyoJ+L7vm3nG+0ywWLw/WCJTApQ0LlsEH3QcB6WU3CLA9mg0emEcxyilLprNZrft7u6eBL7CIhV+mW3bz43jmKIoKIpiG/izx8LYUcv2SimCIOg8C4Dv+yd3d3cbwGrXefJBAMikDgBZuO3xAXxAa72V5/mJJElQSh2v6/q41P5d18W2benibgO327b9nQ01/0OZlv2NG1wLhNa6a6EVRbE65/6yLK9qbdM+K20CMJGFWil4koARhqH0/ABu0Fp/djweD13XfYaZZ9d1zWw2E7G/Ocuy03meL20oMbplWV3TRAKW7lDtLZrryjyRytWKj/QPVwEEPlGW5VWmrdoEQCEHbH3585qm+Vf4QczeJkD4vv+eIAjes7u7e11ZlseBC1gUNr4JbGdZdu+mkpRIismEMCUknkdAEpLozpQGUzrkbyv0RfleSxbQLbrWC7SLWOZinucxn8+X0E3T9C7Lsu6SGyrLclNgs0Ry84fV7VY/X73hdSCtoYe01hhtdI9FTAIsA6Bl0XYjzywh2bYtVdhD2Dv3tLe39zjgkTiOl8JxSallrKOiKPZgSTKWwn/zW7VMbIOJZ06nU6bTKbPZjDzPO6QPQbyjc/H0bjwe/7FS6vtAmef5dZvmmdHdUqjb5jASJbIIojralw4DgugvFEXxYhNhpRRhGLLq+9eRZVmmSz2UDmBgKFUhYGg+tzPHAeSZ6wNLlWoTgEfNKKuNx4erAIjuHtQIEeb39vbOpO+4iXrQGcorJpNJugmEDcD0hC/grbSSvg6Az0tOb1DSvsfpxpo5S2TbNnVdk+f5WuabpklGo9HgII5Xvve/K8HQ4zZJywYJ8o01T6/uZQLwvaZp3qWUYj6fC5NfPKjLugqEWjyTkybKOkqAsVLqkd3d3Vs2Mb5i0PIVQNQZqoBveJx9N7dqOidtIUQs7InxePwUqfCYw4i3lw4u6mPW92UAx23bpg2lbx6NRheYL8OE5NVIWy4bma9MgHrDTW+iAroawRVAdhAA3xCXB10T5PnrOizSRZKfYhOCIFhKSFZefVjCsCRUEmabPt5xHIIgkO9MBSCx6mdoCB+o65ogCLBt+9dZ9C42AvClpmm6el676FXiDteN9hFkd2sHzQVOCrMtc6/J8/y5qwZ1pcD5xBWVmK8yLqCuoyRJHpEUuc1oh+bnq4+kIiBP07R7pzebzdBaP8VxnG9sghjo1OIwmkwmW0EQDCW0bsPrbRatrm8DJYtHWBcDL/c877IwDDtwAddxnGp13YPUoK7rr4VheJFt20wmk12tdX8TAAB/6TjOG8wqT1EUt8Vx/IeHMTedTo8S3j4NuM33/eNBEEilprM7chaxNXL7rVf5HeDOdevKM5x1Hmo0Gn0qDMNntwA0WuuOuXUPJN5aVVVpWdaNUmoGfnFTqCkk+t9WZg+i/wS227T1uHgV0xCav1dVJVJ44ybmga4nsUrtOk+VLBf4yL4Ja27t6bQt6yRJpEA6MHt2MqQvmGUZg8HgKA+ghJ5I+xjKcRztum7X+pZKbluZvge4Wspyq2TbNkEQdH2GNYb3zZZl6TRNZb0Xmd5jSQXMnHk2m52MouhZjuMwHo/RWl/u+/7nTOCkViC9PjFKeZ6vvY3Vg/f7fU6fPn0ei3+XuRz4CRaBy4hF/f7eNE0/KZHlutqCgL6p6PLwww+f6vV657XfPwWcv1R7WF3QoO2iKJ4lVZ6qql5dluXnBLkgCLpU1MznlVIkScJkMjkUBIDBYHC6qqoPlGX5AdH7+Xx+YIYnJO+CNqndaDT6c9d1z2uapmvKrM5ZkgBzw6ZpOo8ASEXoTUqpWzzPW/L/q8mRSMJ4PDYLEUskEiCdIengrAIg51qVAMuyDk3K5vP5I1EUDRzHYTQaEcexWg3RlyA2gxzP8/aA94qfz7IM4E+11m9po7qNOYFISZqmR3KNZ0MCyqYxn88vVUoNHMfpXO2hvcGWyY5OnTr1XcdxmM1m3eOm2Wx2087OTh3H8c0HHVBQlt7AJkk4G5In9QclZZPJ5DXiFlsAbt33QIoVCZD424jDv1qWJZZlMZvNvmxZFr1eD6XUG/M8P/SdvhjKcy0J7TtC+feZtQP4bSMu+FgQBN9aZyiXAFgTuv6b8fLikr29vW9KSOm67nAymfx7nucv2dnZ2RiIiyQc5bXoQSTryPO8g0ZRFJcppbL2d1i0ziQhW6K1DyUNOrWzs/NJpdSVbSBx53g8fqXv+xe0ycULyrJ8QV3X7O7uWm0TdB+Ji0zT9MjeYR3Jc9fDos35fD6UZ7F1XU/iOP6XTXsuScBkMtk3gG3j//Q+A7ywKIp3tJ+ZjdEDfZYUWzfV5w/7rlh9KZkfUgT5uESQtO8RNrrVI+TTAM8HXrTytyuA9wKv5Qhv9H8EdA3wknUfrI0Ef1zpsfzT1P8L+j+jBDv6UEdeKQAAAABJRU5ErkJggg=="

$filePicked = Invoke-OpenFileDialog -Title $title -InitialDirectory $initialDirectory -Filter $filter -IconBase64 $iconBase64OpenFileDialog -TopMost $true

# Then use this to check if the picker has done its job.
if ($filePicked -ne "") {
  $filePicked
  Write-Host 'File Picked...'
}
else {
  Write-Host 'File Not Picked...'
}

Upvotes: 0

Theo
Theo

Reputation: 61188

Found it!

Create your form and use my code from here to give that form your own icon.

Then, from a button for example on the form, you open the OpenFile dialog, using your function. The dialog will then have the icon used in your form.

# start the code with your own function to show the OpenFile dialog
function Invoke-OpenFileDialog {

  Param (
    [Parameter(Mandatory=$true, Position=0)] [string] $Title,
    [Parameter(Mandatory=$true, Position=1)] [string] $InitialDirectory,
    [Parameter(Mandatory=$true, Position=2)] [string] $Filter
    )

  if ($InitialDirectory -ne "") {
    if (!(Test-Path -LiteralPath $InitialDirectory -PathType Container)) {
      $InitialDirectory = ([System.IO.FileInfo]$InitialDirectory).DirectoryName
    }
  }

  $OpenFileDialog                  = New-Object System.Windows.Forms.OpenFileDialog
  $OpenFileDialog.Filter           = $Filter
  $OpenFileDialog.InitialDirectory = $InitialDirectory
  $OpenFileDialog.Title            = $Title
  $result                          = $OpenFileDialog.ShowDialog()
  $OpenFileDialog.Dispose()

  if ($result -eq 'OK') {
    return $OpenFileDialog.FileName
  }
  else { return "" }

}

# next, create your form (just a simple demo below) and from there show the dialog
# (I'm using a button on the form to do this)
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$form            = New-Object system.Windows.Forms.Form
$form.ClientSize = '400,230'
$form.text       = "Test"
$form.TopMost    = $false

# This base64 string holds the bytes that make up the 16x16 StackOverflow icon
$iconBase64 = @'
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB
tUlEQVQ4y5WSTUtUYRzFf/d6r00FMQPCFG3yUsyYH6BCooUv5ZeoIImEghauMojqAwQu3QSSZEEt
KmozgwVGYC+EFGTGtcHc1DgSjI339bQwJsaZUeesHv7PeQ7nf85jSBLbQJXfgDB2J+vuTHYA78Ew
/pNRiILWBPRnFYD206OEC9MEsxMNSM0QVLR256S857ekOJL/5q7Kt7OKlj7U0Jo7sBK0D1wj/PSU
9alhrO5BrOwA3uMRVC5uvUL84yPxyiLW0TMkzt0j/jnP+sRZ7BMXkGL8Z9erXKNRC96jq4SfX2Bl
+7F7LmIkD+I9vEz86xt2zxBmx2HaMr3NBUBEX6cJZsaJlt7TdugY9vHzhF9yWNn+6uOGIUbLc4qW
56SgIkkKC29VmRxS+eYR+a/H67Kuc+BNXSKcz4NpYXZ0Yqa7MPd3gWFidQ9i7DtQ49WQpEXXxXVd
evv60FqRuOiiUoG4VEAr34lXC6hUYM/ILPlXMziOQ6fjbJS1efvw3f3/6tYujHQGM53ZGNiJ+rY3
D/yXY02/hn3qyvYCe28s0ApqBPK5HK3CAkimUjj/QtkJkqlU9fwXBBkCP6jNZvAAAAAASUVORK5C
YII=
'@

$iconBytes       = [Convert]::FromBase64String($iconBase64)
$stream          = New-Object IO.MemoryStream($iconBytes, 0, $iconBytes.Length)
$stream.Write($iconBytes, 0, $iconBytes.Length)
$form.Icon       = [System.Drawing.Icon]::FromHandle((New-Object System.Drawing.Bitmap -Argument $stream).GetHIcon())

$button = New-Object System.Windows.Forms.Button 
$button.Size = New-Object System.Drawing.Size(90,24)
$button.Left = $form.Width - $button.Width - 40
$button.Top = $form.Height - $button.Height * 3
$button.Text = 'Open File'
$button.Add_Click({
    # in here, we use your function
    $title = 'OpenFileDialog Title'
    $initialDirectory = ([System.IO.FileInfo]"C:\Users\").DirectoryName
    $filter = 'All files (*.*)| *.*'
    $filePicked = Invoke-OpenFileDialog -Title $title -InitialDirectory $initialDirectory -Filter $filter

    # Then use this to check if the picker has done its job.
    if ($filePicked -ne "") {
      $filePicked
      Write-Host 'File Picked...'
    }
    else {
      Write-Host 'File Not Picked...'
    }
})
$form.Controls.Add($button)

[void]$form.ShowDialog()

# when done, dispose of the form
$form.Dispose()

Now, if you run this, you'll see the form:

enter image description here

and if you click the button, the dialog shows up, including your forms icon:

enter image description here


You can do this for a WPF UI aswell, although setting a WPF form with an embedded icon is slightly different:

# start the code with your own function to show the OpenFile dialog
function Invoke-OpenFileDialog {
    Param (
    [Parameter(Mandatory=$true, Position=0)] [string] $Title,
    [Parameter(Mandatory=$true, Position=1)] [string] $InitialDirectory,
    [Parameter(Mandatory=$true, Position=2)] [string] $Filter
    )

    if ($InitialDirectory -ne "") {
        if (!(Test-Path -LiteralPath $InitialDirectory -PathType Container)) {
            $InitialDirectory = ([System.IO.FileInfo]$InitialDirectory).DirectoryName
        }
    }

    $OpenFileDialog                  = New-Object System.Windows.Forms.OpenFileDialog
    $OpenFileDialog.Filter           = $Filter
    $OpenFileDialog.InitialDirectory = $InitialDirectory
    $OpenFileDialog.Title            = $Title
    $result                          = $OpenFileDialog.ShowDialog()
    $OpenFileDialog.Dispose()

    if ($result -eq 'OK') {
        return $OpenFileDialog.FileName
    }
    else { return "" }
}

Add-Type -AssemblyName PresentationFramework
Add-Type -AssemblyName System.Windows.Forms

[xml]$xaml = @"
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="Window" Title="Initial Window" WindowStartupLocation = "CenterScreen"
    Width = "400" Height = "230" ShowInTaskbar = "True">
    <Button x:Name = "Button" Height = "24" Width = "90" Content = 'Open File' />
</Window>
"@

$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Window=[Windows.Markup.XamlReader]::Load( $reader )

# This base64 string holds the bytes that make up the 16x16 StackOverflow icon
$iconBase64 = @'
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB
tUlEQVQ4y5WSTUtUYRzFf/d6r00FMQPCFG3yUsyYH6BCooUv5ZeoIImEghauMojqAwQu3QSSZEEt
KmozgwVGYC+EFGTGtcHc1DgSjI339bQwJsaZUeesHv7PeQ7nf85jSBLbQJXfgDB2J+vuTHYA78Ew
/pNRiILWBPRnFYD206OEC9MEsxMNSM0QVLR256S857ekOJL/5q7Kt7OKlj7U0Jo7sBK0D1wj/PSU
9alhrO5BrOwA3uMRVC5uvUL84yPxyiLW0TMkzt0j/jnP+sRZ7BMXkGL8Z9erXKNRC96jq4SfX2Bl
+7F7LmIkD+I9vEz86xt2zxBmx2HaMr3NBUBEX6cJZsaJlt7TdugY9vHzhF9yWNn+6uOGIUbLc4qW
56SgIkkKC29VmRxS+eYR+a/H67Kuc+BNXSKcz4NpYXZ0Yqa7MPd3gWFidQ9i7DtQ49WQpEXXxXVd
evv60FqRuOiiUoG4VEAr34lXC6hUYM/ILPlXMziOQ6fjbJS1efvw3f3/6tYujHQGM53ZGNiJ+rY3
D/yXY02/hn3qyvYCe28s0ApqBPK5HK3CAkimUjj/QtkJkqlU9fwXBBkCP6jNZvAAAAAASUVORK5C
YII=
'@

$iconBytes  = [Convert]::FromBase64String($iconBase64)
$stream     = New-Object IO.MemoryStream($iconBytes, 0, $iconBytes.Length)
$stream.Write($iconBytes, 0, $iconBytes.Length)
# set the form's icon
$Window.Icon = [System.Windows.Media.Imaging.BitmapFrame]::Create($stream)

# connect to the button
$button = $Window.FindName("Button")
$button.Add_Click({
    # in here, we use your function
    $title = 'OpenFileDialog Title'
    $initialDirectory = ([System.IO.FileInfo]"C:\Users\").DirectoryName
    $filter = 'All files (*.*)| *.*'
    $filePicked = Invoke-OpenFileDialog -Title $title -InitialDirectory $initialDirectory -Filter $filter

    # Then use this to check if the picker has done its job.
    if ($filePicked -ne "") {
        $filePicked
        Write-Host 'File Picked...'
    }
    else {
        Write-Host 'File Not Picked...'
    }
})

$null = $Window.ShowDialog()

Upvotes: 1

Related Questions