<# .SYNOPSIS Search for aircraft photos on Airport-data.com by the aircraft's registration number .DESCRIPTION This simple GUI script allows you to enter an aircraft registration and then search Airport-data.com for photos and specifications of that aircraft. Interactive usage: enter an aircraft registration in the input texbox and press Enter or click the Search button to search Airport-data.com's website for photos and detailed specifications. Command line usage: run this script with -Help parameter to view its command line syntax. .NOTES Dashes are mandatory in many aircraft registrations, but not all, e.g. PH-PBY and N1944S will work, but PHPBY and N-1944S won't. Invalid command line switches starting with a dash will trigger a PowerShell error message. All command line switches starting with a slash will trigger this script's help screen. This script can be extended by using downloaded local aircraft registration databases; see this script's web page (see links section) for details. Return code ("ErrorLevel") is 1 in case of errors, otherwise 0. .PARAMETER AircraftRegistration (optional) A valid aircraft registration, e.g. PH-PBY or N1944S or OK-NUL. Aircraft registration may be entered in the GUI if not specified on the command line. .PARAMETER SearchEngine (optional) Alternative search engine if no match was found on Airport-data.com. Valid SearchEngine values are 'DuckDuckGo', 'Google' (default) or 'StartPage'. Useful only if local database extension scripts are installed. Command line only, cannot be changed interactively in the GUI. .PARAMETER Hide Hides the console window (GUI remains visible). Command line only, cannot be changed interactively in the GUI. .PARAMETER Debug Shows some progress messages, especially usefull when using local databases. Command line only, cannot be changed interactively in the GUI. .PARAMETER Version Show this script's version number. If combined with -Verbose show full script path, version number and last/modified/release date. .PARAMETER Help Shows this script's help screen, with more details than the Help button's help text. .EXAMPLE powershell . ./AirRegGUI.ps1 Will open the GUI with empty input textbox, the console remains visible .EXAMPLE powershell . ./AirRegGUI.ps1 -Hide Will open the GUI with empty input textbox and hide the console .EXAMPLE powershell . ./AirRegGUI.ps1 N1944S Will open the GUI with N1944S in input textbox, and start search immediately, the console remains visible .EXAMPLE powershell . ./AirRegGUI.ps1 -AircraftRegistration N1944S Will open the GUI with N1944S in input textbox, and start search immediately, the console remains visible .EXAMPLE powershell . ./AirRegGUI.ps1 PH-PBY -Hide Will open the GUI with PH-PBY in input textbox, start search immediately, and hide the console .EXAMPLE powershell . ./AirRegGUI.ps1 -AircraftRegistration PH-PBY -Hide Will open the GUI with PH-PBY in input textbox, start search immediately, and hide the console .LINK Script written by Rob van der Woude: https://www.robvanderwoude.com/airreg.php .LINK Airport-data API courtesy of Airport-data.com: http://www.airport-data.com/api/doc.php .LINK Script created in Visual Studio Community 2019 with a trial version of Ironman Software's PowerShell Pro Tools Suite: https://ironmansoftware.com/powershell-pro-tools/ .LINK Capturing Enter key (as a work-around for the form's AcceptButton not working as expected) by sodawillow on StackOverflow.com: https://stackoverflow.com/a/41441704 .LINK Code to hide console window by Anthony on StackOverflow.com: http://stackoverflow.com/a/15079092 .LINK Use of Shown event (to make sure the GUI is visible before starting an optional immediate search) by Matthias Schippling on StackOverflow.com: https://stackoverflow.com/a/219155 .LINK Capture -Debug and -Verbose parameter by mklement0 on StackOverflow.com: https://stackoverflow.com/a/48643616 .LINK Embedded icon based on code by Theo on StackOverflow.com: https://stackoverflow.com/a/53377253 .LINK Airplane icon image courtesy of Icons8.com: https://icons8.com/ #> param ( [parameter( ValueFromPipeline )] [ValidatePattern("(^\s*$|[\?/]|^\w[\w-]{2,3}\w+)")] [string]$AircraftRegistration = '', [parameter( ValueFromPipeline )] [ValidateSet('DuckDuckGo','Google','StartPage')] [string]$SearchEngine = 'Google', [switch]$Hide, [switch]$Help, [switch]$Version ) $progver = "2.16" $AircraftRegistration = $AircraftRegistration.ToUpper( ) $Manufacturer = '' $Model = '' [bool]$Debug = $Debug -or ( $PSBoundParameters.ContainsKey( 'Debug' ) ) [bool]$Verbose = ( $PSBoundParameters.ContainsKey( 'Verbose' ) ) $global:notfound = $true if ( $Version ) { if ( $Verbose ) { $lastmod = ( [System.IO.File]::GetLastWriteTime( $PSCommandPath ) ) if ( $lastmod.ToString( "h.mm" ) -eq $progver ) { "`"{0}`", Version {1}, release date {2}" -f $PSCommandPath, $progver, $lastmod.ToString( "yyyy-MM-dd" ) } else { # if last modified time is not equal to program version, the script has been tampered with "`"{0}`", Version {1}, last modified date {2}" -f $PSCommandPath, $progver, $lastmod.ToString( "yyyy-MM-dd" ) } } else { $progver } exit 0 } if ( $Help -or ( $AircraftRegistration -match "[/\?]" ) ) { Clear-Host Write-Host ( "`"{0}`", Version {1}" -f ( "$PSCommandPath" -replace "$PSScriptRoot","" ), $progver ) -NoNewline $lastmod = ( [System.IO.File]::GetLastWriteTime( $PSCommandPath ) ) if ( $lastmod.ToString( "h.mm" ) -eq $progver ) { Write-Host ", release date " -NoNewline } else { # if last modified time is not equal to program version, the script has been tampered with Write-Host ", last modified date " -NoNewline } Write-Host $lastmod.ToString( "yyyy-MM-dd" ) Write-Host Get-Help $PSCommandPath -Full exit -1 } $global:airportdatalink = '' $Debug = ( $PSBoundParameters.ContainsKey( 'Debug' ) ) $defaulthelptext = "Enter an aircraft registration number, e.g. `"PH-PBY`" and click the Search button.`n`n" + ` "This script will then search Airport-Data.com for photos of the aircraft with that registration.`n`n" + ` "If found, a thumbnail of the photo will be displayed in this script's window, plus a button to view the photo full size in your default browser.`n`n" + ` "{0} 2022 Rob van der Woude`nhttps://www.robvanderwoude.com" -f [char]0x00A9 # Search query templates if ( $SearchEngine -match '^DuckDuckGo$' ) { $SearchEngine = 'DuckDuckGo' $searchtemplate = "https://duckduckgo.com/html/?q=x{0}" } elseif ( $SearchEngine -match '^Google$' ) { $SearchEngine = 'Google' $searchtemplate = "https://www.google.com/search?q={0}" } elseif ( $SearchEngine -match '^Startpage$' ) { $SearchEngine = 'StartPage' $searchtemplate = "https://startpage.com/do/search?cat=web&cmd=process_search&language=english&engine0=v1all&query={0}" } else { if ( -not $Quiet ) { Write-Host ( "Invalid -SearchEngine value `"{0}`", using Google instead" -f $SearchEngine ) } $SearchEngine = 'Google' $searchtemplate = "https://www.google.com/search?q={0}" # Google by default } if ( $Debug ) { Write-Host ( "Search Engine: {0}" -f $SearchEngine ) Write-Host ( "Search template: {0}" -f $searchtemplate ) } ####################################### # Hide console window # # by Anthony on StackOverflow.com # # http://stackoverflow.com/a/15079092 # ####################################### $signature1 = @' public static void ShowConsoleWindow( int state ) { var handle = GetConsoleWindow( ); ShowWindow( handle, state ); } [System.Runtime.InteropServices.DllImport( "kernel32.dll" )] static extern IntPtr GetConsoleWindow( ); [System.Runtime.InteropServices.DllImport( "user32.dll" )] static extern bool ShowWindow( IntPtr hWnd, int nCmdShow ); '@ # Hide console if requested if ( $Hide ) { $hideconsole = Add-Type -MemberDefinition $signature1 -Name Hide -Namespace HideConsole -ReferencedAssemblies System.Runtime.InteropServices -PassThru $hideconsole::ShowConsoleWindow( 0 ) } ####################### # End of Hide console # ####################### ########################### # Start of Event handlers # ########################### $ButtonHelp_Click = { $scriptname = $PSCommandPath.Substring( $PSScriptRoot.Length ) $inserttext = "If local database extensions are installed, a local search will be initiated if no match was found online on Airport-data.com.`n" + ` "Local searches take considerably longer than online searches!`n" + ` "See https://www.robvanderwoude.com/airreg.php for details on local database extensions.`n`n" + ` "For detailed help use the command:`n`n" + ` " . '.{0}' -Help`n`nor:`n`n" -f $scriptname + ` " . '.{0}' /?`n`nor:`n`n" -f $scriptname + ` " Get-Help '.{0}' -Full`n`n" -f $scriptname + ` "Do you want to open this script's web page now?`n`n{1}" -f $scriptname, [char]0x00A9 $helptext = $defaulthelptext -replace [char]0x00A9, $inserttext $title = "Help for {0}" -f $AirRegGUI.Text $answer = [System.Windows.Forms.MessageBox]::Show( $helptext, $title, 'YesNo' ) if ( $answer -eq 'Yes' ) { Start-Process 'https://www.robvanderwoude.com/airreg.php' } } $ButtonOpenLink_Click = { Start-Process $global:airportdatalink -WindowStyle 1 } $ButtonSearch_Click = { Search-Aircraft } $TextboxReg_KeyUp = { Validate-Input( $_.KeyCode ) } $TextboxReg_TextChanged = { Validate-Input } $Window_Load = { $AirRegGUI.Text = "AirRegGUI.ps1 - Version {0}" -f $progver # window title $LabelHelptext.Text = $defaulthelptext # help text in window } $Window_Shown = { if ( ![string]::IsNullOrWhiteSpace( $AircraftRegistration ) ) { $TextboxReg.Text = $AircraftRegistration # enter specified aircraft registration in input textbox $TextboxReg.SelectionStart = $TextboxReg.Text.Length # move cursor to end of input text $TextboxReg.SelectionLength = 0 # Start search immediately [System.Windows.Forms.Application]::DoEvents( ) # start updating GUI Start-Sleep -Seconds 1 # allow GUI update to complete Validate-Input( 'Return' ) } } ######################### # End of Event handlers # ######################### function Check-Update( ) { $ProgressPreference = 'SilentlyContinue' $checkupdate = ( Invoke-WebRequest -Uri 'https://www.robvanderwoude.com/updates/airreg.txt' -TimeoutSec 10 ) $ProgressPreference = 'Continue' if ( $checkupdate.StatusCode -eq 200 ) { $latestversion = [float]$checkupdate.Content $currentversion = [float]$progver if ( $latestversion -gt $currentversion ) { $title = 'Update Available' $message = ( "An update for this script is available.`nYour current version is {0}, the latest version available is {1}.`n`n" + ` "Do you want to open the download page for the update?" -f ( $currentversion -replace ",","." ), ( $latestversion -replace ",","." ) ) $buttons = [System.Windows.Forms.MessageBoxButtons]::YesNo if ( [System.Windows.Forms.MessageBox]::Show( $message, $title, $buttons ) -eq 'Yes' ) { Start-Process 'https://www.robvanderwoude.com/airreg.php' } } } } function Search-LocalDB( $message = 'Not found' ) { [OutputType([bool])] $prefix = '' $registration = $TextboxReg.Text $found = $false if ( $registration.Contains( '-' ) ) { $prefix = $registration.Split( '-' )[0] } else { if ( Test-Path ( "$PSScriptRoot\AirReg{0}Cmd.ps1" -f $registration.Substring( 0, 2 ) ) -PathType 'Leaf' ) { $prefix = $registration.Substring( 0, 2 ) } elseif ( Test-Path ( "$PSScriptRoot\AirReg{0}Cmd.ps1" -f $registration.Substring( 0, 1 ) ) -PathType 'Leaf' ) { $prefix = $registration.Substring( 0, 1 ) } else { $prefix = '' } } if ( -not [string]::IsNullOrWhiteSpace( $prefix ) ) { $localDBscript = ( Join-Path -Path $PSScriptRoot -ChildPath ( "AirReg{0}Cmd.ps1" -f $prefix ) ) if ( $Debug ) { Write-Host ( "Found local '{0}' database file `"{1}`"" -f $prefix, $localDBscript ) } $ButtonOpenLink.Visible = $false $LabelPhotographer.Visible = $false $PictureboxThumbnail.Visible = $false $ButtonOpenLink.Enabled = $false $LabelHelptext.Text = "Searching local database, this may take a while..." $LabelHelptext.Visible = $true [System.Windows.Forms.Application]::DoEvents( ) # update GUI $Manufacturer = '' $Model = '' if ( $Debug ) { $Stopwatch = [System.Diagnostics.Stopwatch]::StartNew( ) Write-Host ( "Start searching local database at {0}" -f ( Get-Date ) ) if ( ( Get-Content $localDBscript ) -match 'TerminateExcel' ) { Write-Host ( "Starting extension script `"{0}`" with Arguments {1} -TerminateExcel -Debug at {2}" -f $localDBscript, $registration, $stopwatch.Elapsed ) . "$localDBscript" -Registration $registration -TerminateExcel -Debug } else { Write-Host ( "Starting extension script `"{0}`" with Arguments {1} -Debug at {2}" -f $localDBscript, $registration, $stopwatch.Elapsed ) . "$localDBscript" -Registration $registration -Debug } Write-Host ( "Finished at {0} (time elapsed {1})" -f ( Get-Date ), $Stopwatch.Elapsed ) $Stopwatch.Stop( ) Write-Host ( "Registration = {0}" -f $registration ) Write-Host ( "Manufacturer = {0}" -f $Manufacturer ) Write-Host ( "Model = {0}" -f $Model ) } else { if ( ( Get-Content "$localDBscript" ) -match 'TerminateExcel' ) { . "$localDBscript" -Registration $registration -TerminateExcel } else { . "$localDBscript" -Registration $registration } } if ( $Model ) { if ( $Manufacturer ) { $LabelHelptext.Text = ( "{0} {1}" -f $Manufacturer, $Model ) $searchquery = ( ( ( "{0} {1} {2}" -f $Manufacturer, $Model, $registration ) -replace " ","+" ) -replace ",","" ) } else { $LabelHelptext.Text = $Model $searchquery = ( ( ( "{0} {1}" -f $Model, $registration ) -replace " ","+" ) -replace ",","" ) } $global:airportdatalink = ( $searchtemplate -f $searchquery ) $ButtonOpenLink.Enabled = $true $ButtonOpenLink.Text = ( 'Search on {0}' -f $SearchEngine ) $ButtonOpenLink.Visible = $true [System.Windows.Forms.Application]::DoEvents( ) # start updating GUI Start-Sleep -Seconds 1 # allow GUI update to complete $found = $true $global:notfound = $false } else { if ( Test-Path -Path "$PSScriptRoot\$prefix" -PathType 'Container' ) { $local = 'local' } else { $local = 'online' } $message = ( "$message, and not found in {0} {1} database either" -f $local, $prefix ) $LabelHelptext.Text = $message [System.Windows.Forms.Application]::DoEvents( ) # start updating GUI Start-Sleep -Seconds 1 # allow GUI update to complete Search-OpenSky $message } } else { $message = ( "$message, no local {0} database found" -f $prefix ) $LabelHelptext.Text = $message [System.Windows.Forms.Application]::DoEvents( ) # start updating GUI Start-Sleep -Seconds 1 # allow GUI update to complete Search-OpenSky $message } $found } function Search-OpenSky( $message = 'Not found' ) { [OutputType([bool])] $registration = $TextboxReg.Text $found = $false $openskyscript = ( Join-Path $PSScriptRoot 'AirRegOpenSkyCmd.ps1' ) if ( Test-Path -Path $openskyscript -PathType 'Leaf' ) { $LabelHelptext.Text = ( "{0}, searching OpenSky database, this may take a minute..." -f $LabelHelptext.Text ) [System.Windows.Forms.Application]::DoEvents( ) # start updating GUI Start-Sleep -Seconds 1 # allow GUI update to complete if ( $Debug ) { Write-Host ( "Found OpenSky extension `"{0}`"" -f $openskyscript ) . "$openskyscript" -Registration $registration -NoBreak -Debug } else { . "$openskyscript" -Registration $registration -NoBreak } if ( $Model ) { if ( $Manufacturer ) { $LabelHelptext.Text = ( ( "{0} {1}" -f $Manufacturer, $Model ) -replace "`"","" ) $searchquery = ( ( ( ( "{0} {1} {2}" -f $Manufacturer, $Model, $registration ) -replace " ","+" ) -replace ",","" ) -replace "`"","" ) } else { $LabelHelptext.Text = $Model $searchquery = ( ( ( ( "{0} {1}" -f $Model, $registration ) -replace " ","+" ) -replace ",","" ) -replace "`"","" ) } $global:airportdatalink = ( $searchtemplate -f $searchquery ) $ButtonOpenLink.Enabled = $true $ButtonOpenLink.Text = ( 'Search on {0}' -f $SearchEngine ) $ButtonOpenLink.Visible = $true $found = $true $global:notfound = $false } else { $LabelHelptext.Text = "$message, nor in OpenSky database" } } else { $LabelHelptext.Text = $message } $global:notfound } function Search-Aircraft( ) { $url = ( 'http://www.airport-data.com/api/ac_thumb.json?r={0}' -f $TextboxReg.Text ) $ProgressPreference = 'SilentlyContinue' $json = ( Invoke-WebRequest -Uri $url -TimeoutSec 10 ).Content | ConvertFrom-Json -ErrorAction Stop $ProgressPreference = 'Continue' if ( $json.status -eq 200 ) { $LabelHelptext.Visible = $false $PictureboxThumbnail.ImageLocation = $json.data.image $LabelPhotographer.Visible = $true $LabelPhotographer.Text = ( "Photographer: {0}" -f $json.data.photographer ) $ButtonOpenLink.Enabled = $true $global:airportdatalink = $json.data.link $PictureboxThumbnail.Visible = $true $ButtonOpenLink.Visible = $true $aircraftdescription = ( ( Invoke-WebRequest -Uri $global:airportdatalink ).Content | Select-String -Pattern ( '{0},[^\",]+' -f $TextboxReg.Text ) ) if ( $aircraftdescription.Matches.Count -gt 0 ) { $aircrafttype = $aircraftdescription.Matches[0].Value $aircrafttype = $aircrafttype -replace ( "^{0}, " -f $TextboxReg.Text ), '' $aircrafttype = $aircrafttype -replace "^[12][0-9][0-9][0-9] ", '' $aircrafttype = $aircrafttype -replace " C/N.+$", '' $LabelAircraftType.Visible = $true $LabelAircraftType.Text = $aircrafttype } } else { $ButtonOpenLink.Visible = $false $LabelPhotographer.Visible = $false $PictureboxThumbnail.Visible = $false $ButtonOpenLink.Enabled = $false if ( Search-LocalDB( ( 'Status {0}, error {1} (aircraft registration not found on Airport-Data.com)' -f $json.status, $json.error ) ) ) { if ( $global:notfound ) { [console]::Beep( 500, 500 ) # beep if registration not found } } $LabelHelptext.Visible = $true } } function Validate-Input( $key = $null ) { if ( $key -eq 'Return' ) { Search-Aircraft } else { $cursorpos = $TextboxReg.SelectionStart + $TextboxReg.SelectionLength $inputtext = $TextboxReg.Text.ToUpper( ) $inputtext = $inputtext -replace "[^A-Z\d\-]","" if ( $inputtext -cne $TextboxReg.Text ) { if ( $inputtext -cne $TextboxReg.Text.ToUpper( ) ) { [console]::Beep( 500, 500 ) # beep in case of invalid character } $TextboxReg.Text = $inputtext $TextboxReg.SelectionStart = [Math]::Min( $cursorpos, $inputtext.Length ) $TextboxReg.SelectionLength = 0 } if ( ( $inputtext -replace "-","" ).Length -ge 4 ) { $ButtonSearch.Enabled = $true } else { $ButtonSearch.Enabled = $false } $LabelHelptext.Visible = $true $LabelHelptext.Text = $defaulthelptext $LabelAircraftType.Text = '' $LabelAircraftType.Visible = $false $LabelPhotographer.Text = '' $LabelPhotographer.Visible = $false $PictureboxThumbnail.Visible = $false $ButtonOpenLink.Text = 'View photo on Airport-data.com' $ButtonOpenLink.Enabled = $false $ButtonOpenLink.Visible = $false } } ############################################ # GUI form design was saved separately by # # Visual Studio/Ironman Software's # # PowerShell Pro Tools Suite as # # AirRegGUI.designer.ps1 and then manually # # embedded in AirRegGUI.ps1 by yours truly # # # # Start of embedded AirRegGUI.designer.ps1 # ############################################ [void][System.Reflection.Assembly]::Load( 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' ) [void][System.Reflection.Assembly]::Load( 'System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' ) $AirRegGUI = New-Object -TypeName System.Windows.Forms.Form [System.Windows.Forms.TextBox]$TextboxReg = ( New-Object -TypeName System.Windows.Forms.TextBox ) [System.Windows.Forms.Button]$ButtonSearch = ( New-Object -TypeName System.Windows.Forms.Button ) [System.Windows.Forms.Button]$ButtonHelp = ( New-Object -TypeName System.Windows.Forms.Button ) [System.Windows.Forms.Button]$ButtonOpenLink = ( New-Object -TypeName System.Windows.Forms.Button ) [System.Windows.Forms.PictureBox]$PictureboxThumbnail = ( New-Object -TypeName System.Windows.Forms.PictureBox ) [System.Windows.Forms.Label]$LabelHelptext = ( New-Object -TypeName System.Windows.Forms.Label ) [System.Windows.Forms.Label]$LabelAircraftType = ( New-Object -TypeName System.Windows.Forms.Label ) [System.Windows.Forms.Label]$LabelPhotographer = ( New-Object -TypeName System.Windows.Forms.Label ) ( [System.ComponentModel.ISupportInitialize]$PictureboxThumbnail ).BeginInit( ) $AirRegGUI.SuspendLayout( ) $TextboxReg.Location = (New-Object -TypeName System.Drawing.Point -ArgumentList @( [System.Int32]37, [System.Int32]41 ) ) $TextboxReg.MaxLength = [System.Int32]8 $TextboxReg.Name = [System.String]'TextboxReg' $TextboxReg.Size = (New-Object -TypeName System.Drawing.Size -ArgumentList @( [System.Int32]100, [System.Int32]26 ) ) $TextboxReg.TabIndex = [System.Int32]0 $TextboxReg.Add_TextChanged( $TextboxReg_TextChanged ) $TextboxReg.Add_KeyUp( $TextboxReg_KeyUp ) $ButtonSearch.Location = ( New-Object -TypeName System.Drawing.Point -ArgumentList @( [System.Int32]159, [System.Int32]40 ) ) $ButtonSearch.Name = [System.String]'ButtonSearch' $ButtonSearch.Size = ( New-Object -TypeName System.Drawing.Size -ArgumentList @( [System.Int32]75, [System.Int32]28 ) ) $ButtonSearch.TabIndex = [System.Int32]1 $ButtonSearch.Text = [System.String]'Search' $ButtonSearch.UseVisualStyleBackColor = $true $ButtonSearch.Add_Click( $ButtonSearch_Click ) $ButtonSearch.Enabled = $false $ButtonHelp.Location = ( New-Object -TypeName System.Drawing.Point -ArgumentList @( [System.Int32]256, [System.Int32]40 ) ) $ButtonHelp.Name = [System.String]'ButtonHelp' $ButtonHelp.Size = ( New-Object -TypeName System.Drawing.Size -ArgumentList @( [System.Int32]75, [System.Int32]28 ) ) $ButtonHelp.TabIndex = [System.Int32]2 $ButtonHelp.Text = [System.String]'Help' $ButtonHelp.UseVisualStyleBackColor = $true $ButtonHelp.Add_Click( $ButtonHelp_Click ) $ButtonOpenLink.Enabled = $false #$ButtonOpenLink.Location = ( New-Object -TypeName System.Drawing.Point -ArgumentList @( [System.Int32]37, [System.Int32]315 ) ) $ButtonOpenLink.Location = ( New-Object -TypeName System.Drawing.Point -ArgumentList @( [System.Int32]37, [System.Int32]355 ) ) $ButtonOpenLink.Name = [System.String]'ButtonOpenLink' $ButtonOpenLink.Size = ( New-Object -TypeName System.Drawing.Size -ArgumentList @( [System.Int32]294, [System.Int32]28 ) ) $ButtonOpenLink.TabIndex = [System.Int32]4 $ButtonOpenLink.Text = [System.String]'View photo on Airport-data.com' $ButtonOpenLink.UseVisualStyleBackColor = $true $ButtonOpenLink.Add_Click( $ButtonOpenLink_Click ) $ButtonOpenLink.Visible = $false $PictureboxThumbnail.Location = ( New-Object -TypeName System.Drawing.Point -ArgumentList @( [System.Int32]82, [System.Int32]101 ) ) $PictureboxThumbnail.Name = [System.String]'PictureboxThumbnail' $PictureboxThumbnail.Size = ( New-Object -TypeName System.Drawing.Size -ArgumentList @( [System.Int32]200, [System.Int32]150 ) ) $PictureboxThumbnail.TabIndex = [System.Int32]3 $PictureboxThumbnail.TabStop = $false $PictureboxThumbnail.Visible = $false $LabelHelptext.AutoSize = $true $LabelHelptext.Location = ( New-Object -TypeName System.Drawing.Point -ArgumentList @( [System.Int32]37, [System.Int32]101 ) ) $LabelHelptext.MaximumSize = ( New-Object -TypeName System.Drawing.Size -ArgumentList @( [System.Int32]294, [System.Int32]0 ) ) $LabelHelptext.Name = [System.String]'LabelHelptext' $LabelHelptext.Size = ( New-Object -TypeName System.Drawing.Size -ArgumentList @( [System.Int32]275, [System.Int32]60 ) ) $LabelHelptext.TabIndex = [System.Int32]6 $LabelHelptext.Text = [System.String]'' $LabelAircraftType.AutoSize = $true #$LabelAircraftType.Location = ( New-Object -TypeName System.Drawing.Point -ArgumentList @( [System.Int32]33, [System.Int32]273 ) ) $LabelAircraftType.Location = ( New-Object -TypeName System.Drawing.Point -ArgumentList @( [System.Int32]33, [System.Int32]273 ) ) $LabelAircraftType.Name = [System.String]'$LabelAircraftType' $LabelAircraftType.Size = ( New-Object -TypeName System.Drawing.Size -ArgumentList @( [System.Int32]110, [System.Int32]20 ) ) $LabelAircraftType.TabIndex = [System.Int32]5 $LabelAircraftType.Text = [System.String]'Photographer:' $LabelAircraftType.Visible = $false $LabelPhotographer.AutoSize = $true #$LabelPhotographer.Location = ( New-Object -TypeName System.Drawing.Point -ArgumentList @( [System.Int32]33, [System.Int32]273 ) ) $LabelPhotographer.Location = ( New-Object -TypeName System.Drawing.Point -ArgumentList @( [System.Int32]33, [System.Int32]315 ) ) $LabelPhotographer.Name = [System.String]'LabelPhotographer' $LabelPhotographer.Size = ( New-Object -TypeName System.Drawing.Size -ArgumentList @( [System.Int32]110, [System.Int32]20 ) ) $LabelPhotographer.TabIndex = [System.Int32]5 $LabelPhotographer.Text = [System.String]'Photographer:' $LabelPhotographer.Visible = $false # Icon embedding code by Theo on https://stackoverflow.com/a/53377253 # Airplane icon image courtesy of https://icons8.com/ $iconBase64 = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABY0lEQVR42mNkGGDAiEduIhDbAfFfIE4F4vP0doA5EB+HqnkO5T+mpwNAYD0QB0DZV4HYCog/0dMBmkB8BYiZoPw9QOwFxL/p5QAQmA/ECUj8BUCcSE8HyAHxbSBmQxKrB+ImejkABCYAcT4S/z80VBZRwwEgg/cyQOIaFxAF4ntAzIMk9guIPYF4H6UOeMgAyetGQPwBj9oGBkjQI4OPDJCccY0SB2wHYg8GSJYLwqOWFxoKImjiIA9YAPELch3QC8RFUH4BA6QExAUKgbgPi/g5ILYF4m/kOACUpeZB+aB4tQHi0zjUcwDxTQZIzkAHW4HYD4j/keoAUBF7AknsAQMkr+MCzlDfYgOgaLxIhL2gNHcKiHeBHACKW6oWrySAOlg5AEpIcpSYRCb4MigcMOBRMOCJcMCz4YAXRANeFA94ZTTg1TExgKYNEkJgwJtkA9ooHfBm+YB2TAa8azbgnVO6AAAjEXEBu6DybwAAAABJRU5ErkJggg==' $iconBytes = [Convert]::FromBase64String( $iconBase64 ) $stream = New-Object IO.MemoryStream( $iconBytes, 0, $iconBytes.Length ) $stream.Write( $iconBytes, 0, $iconBytes.Length ); $iconImage = [System.Drawing.Image]::FromStream( $stream, $true ) $AirRegGUI.ClientSize = ( New-Object -TypeName System.Drawing.Size -ArgumentList @( [System.Int32]384, [System.Int32]441 ) ) $AirRegGUI.Controls.Add( $LabelHelptext ) $AirRegGUI.Controls.Add( $LabelAircraftType ) $AirRegGUI.Controls.Add( $LabelPhotographer ) $AirRegGUI.Controls.Add( $ButtonOpenLink ) $AirRegGUI.Controls.Add( $PictureboxThumbnail ) $AirRegGUI.Controls.Add( $ButtonHelp ) $AirRegGUI.Controls.Add( $ButtonSearch ) $AirRegGUI.Controls.Add( $TextboxReg ) $AirRegGUI.Font = ( New-Object -TypeName System.Drawing.Font -ArgumentList @( [System.String]'Microsoft Sans Serif', [System.Single]12, [System.Drawing.FontStyle]::Regular, [System.Drawing.GraphicsUnit]::Point, ( [System.Byte][System.Byte]0) ) ) $AirRegGUI.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedDialog $AirRegGUI.MaximizeBox = $false $AirRegGUI.Name = [System.String]'AirRegGUI' $AirRegGUI.SizeGripStyle = [System.Windows.Forms.SizeGripStyle]::Hide $AirRegGUI.StartPosition = 'CenterScreen' $AirRegGUI.Icon = [System.Drawing.Icon]::FromHandle( ( New-Object System.Drawing.Bitmap -Argument $stream ).GetHIcon( ) ) # Icon embedding code by Theo on https://stackoverflow.com/a/53377253 $AirRegGUI.Text = [System.String]'AirRegGUI.ps1' $AirRegGUI.Add_Load( $Window_Load ) $AirRegGUI.Add_Shown( $Window_Shown ) $AirRegGUI.Add_HelpRequested( $ButtonHelp_Click ) ( [System.ComponentModel.ISupportInitialize]$PictureboxThumbnail ).EndInit( ) $AirRegGUI.ResumeLayout( $false ) $AirRegGUI.PerformLayout( ) Add-Member -InputObject $AirRegGUI -Name base -Value $base -MemberType NoteProperty Add-Member -InputObject $AirRegGUI -Name TextboxReg -Value $TextboxReg -MemberType NoteProperty Add-Member -InputObject $AirRegGUI -Name ButtonSearch -Value $ButtonSearch -MemberType NoteProperty Add-Member -InputObject $AirRegGUI -Name ButtonHelp -Value $ButtonHelp -MemberType NoteProperty Add-Member -InputObject $AirRegGUI -Name PictureboxThumbnail -Value $PictureboxThumbnail -MemberType NoteProperty Add-Member -InputObject $AirRegGUI -Name ButtonOpenLink -Value $ButtonOpenLink -MemberType NoteProperty Add-Member -InputObject $AirRegGUI -Name LabelHelptext -Value $LabelHelptext -MemberType NoteProperty Add-Member -InputObject $AirRegGUI -Name LabelAircraftType -Value $LabelAircraftType -MemberType NoteProperty Add-Member -InputObject $AirRegGUI -Name LabelPhotographer -Value $LabelPhotographer -MemberType NoteProperty ########################################## # End of embedded AirRegGUI.designer.ps1 # ########################################## # Check for program updates and notify user if available Check-Update # Open GUI window [void] $AirRegGUI.ShowDialog( ) # Clean up (ShowDialog does not always clean up by itself) [void] $AirRegGUI.Dispose( )