WindowsStartKeyControl.psm1

<#
    ===========================================================================
     Created on: 30.3.2023. 21:40
     Created by: chxus
     Organization: CHXOFT
     Filename: WindowsStartKeyControl.psm1
    -------------------------------------------------------------------------
     Module Name: WindowsStartKeyControl
    ===========================================================================
#>


<#
    .EXTERNALHELP WindowsStartKeyControl.psm1-Help.xml
#>

function Get-WinKeyDisabled
{
    [CmdletBinding(DefaultParameterSetName = 'WinKeyDisabled')]
    [OutputType([boolean], ParameterSetName='WinKeyDisabled')]
    param
    (
        [Parameter(Mandatory = $false)]
        [ValidateSet('SwitchState', 'Repair', 'GetState')]
        [string]
        $Action = 'GetState'
    )
    
    $wk = "The Windows keyboard start Key is "
    $rn = ', restart the computer to take the effect.'
    $en = $wk + 'ENABLED' + $rn
    $ds = $wk + 'DISABLED' + $rn
    $regKey = 'Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout\'
    $valueName = 'Scancode Map'
    $value = '00-00-00-00-00-00-00-00-03-00-00-00-00-00-5B-E0-00-00-5C-E0-00-00-00-00'
    $valueHex = $value.Split('-') | ForEach-Object { "0x$_" }
    $valueGet = (Get-ItemProperty -Path $regKey).$valueName
    
    function Get-State
    {
        if ($valueGet)
        {
            $valueGet = [System.BitConverter]::ToString($valueGet)
            if ($valueGet -eq $Value)
            { return [boolean]$true }
            else
            { return [boolean]$false }
        }
    }
    
    Switch ($Action)
    {
        GetState{
            if ($valueGet)
            {
                $valueGet = [System.BitConverter]::ToString($valueGet)
                if ($valueGet -eq $Value)
                {
                    return [boolean]$true
                }
                else
                {
                    Write-Warning "The registry has the wrong value, enter 'Get-WinKeyDisabled -Action Repair' to remove the wrong registry key."
                    return
                }
            }
            else
            {
                return [boolean]$false
            }
        }
        SwitchState{
            if (Get-State)
            {
                Remove-ItemProperty -Path $regKey -Name $valueName -Force
                Write-Output $en
                return
            }
            else
            {
                New-ItemProperty -Path $regKey -Name $valueName -PropertyType Binary -Value ([byte[]]$valueHex) | Out-Null
                Write-Output $ds
                return
            }
        }
        Repair{
            if ($valueGet)
            {
                $valueGet = [System.BitConverter]::ToString($valueGet)
                if ($valueGet -eq $Value)
                {
                    Write-Warning 'Key already disabled, nothing to repair.'
                    return
                }
                else
                {
                    Remove-ItemProperty -Path $regKey -Name $valueName -Force
                    Write-Output 'Registry repaired. The key status of the window is activated.'
                }
            }
            else
            {
                Write-Warning 'Key activated, no repair required.'
                return
            }
        }
    }
}