Пользовательский интерфейс PowerShell WPF определяет комбинацию клавиш

Я пишу пользовательский интерфейс для работы в WinPE. У меня пока все работает, и я пытаюсь сделать так, чтобы пользователь не мог закрыть окно. Я сделал его полноэкранным и отключил кнопку закрытия (X), но пользователь по-прежнему может нажать Alt + F4, чтобы закрыть пользовательский интерфейс. Я смог сделать так, что если пользователь нажимает F8, пользовательский интерфейс находится впереди, поэтому пользователь не может использовать Alt + Tab. Я прочитал так много способов сделать это, но ничего не касается PowerShell. Я не уверен, как реализовать это в сценарии. Он не работает в Runspace.

Вот что я пробовал:

$altF4Pressed = {
    [System.Windows.Input.KeyEventArgs]$Alt = $args[1]
    if ( ($Alt.Key -eq 'System') -or ($Alt.Key -eq 'F4') ) {
        if ($_.CloseReason -eq 'UserClosing') {
            $UI.Cancel = $true
        }
    }
}

$null = $UI.add_KeyDown($altF4Pressed)

Я также читал, чтобы сделать это (Отключение Alt+F4 в форме Powershell ), но это не работает.

#disable closing window using Alt+F4
$UI_KeyDown = [System.Windows.Forms.KeyEventHandler]{
    #Event Argument: $_ = [System.Windows.Forms.KeyEventArgs]

    if ($_.Alt -eq $true -and $_.KeyCode -eq 'F4') {
        $script:altF4Pressed = $true;
    }
}

$UI_Closing = [System.Windows.Forms.FormClosingEventHandler]{
    #Event Argument: $_ = [System.Windows.Forms.FormClosingEventArgs]

    if ($script:altF4Pressed)
    {
        if ($_.CloseReason -eq 'UserClosing') {
            $_.Cancel = $true
            $script:altF4Pressed = $false;
        }
    }
    Else{
        [System.Windows.Forms.Application]::Exit();
        # Stop-Process $pid
    }
}


$UI.Add_Closing({$UI_Closing})
$UI.add_KeyDown({$UI_KeyDown})

Я также пытался сделать это:

$UI.Add_KeyDown({
    $key = $_.Key
    If ([System.Windows.Input.Keyboard]::IsKeyDown("RightAlt") -OR [System.Windows.Input.Keyboard]::IsKeyDown("LeftAlt")) {
        Switch ($Key) {
            "F4" {
                $script:altF4Pressed = $true;
                write-host "Alt+f4 was pressed"
            }

        }
    }
})

Он обнаруживает первое нажатие на клавиатуру, но не следующее, пока нажата другая. Я думаю, что вместо этого мне нужно использовать событие Keybinding, просто не знаю, как реализовать это в Powershell на уровне приложения (не на уровне ввода). Я читал, что вы можете добавить привязку клавиш к самому коду XAML, но как это сделать с помощью Powershell, чтобы определить комбинацию клавиш (Alt + F4), когда пользовательский интерфейс представляет себя?


person powershellcrack    schedule 10.10.2020    source источник


Ответы (2)


Я обнаружил, что обнаружение ключей с формами или WPF намного выше моего уровня навыков. Однако я смог выполнить ту же задачу с другим подходом. Мне нужно было сделать это с помощью сценария установки в Windows 10.

Что я сделал, так это отключил обе клавиши Alt влево / вправо и F4 во время работы сценария и отменил изменения, удалил ключ после завершения .

Поскольку реестр WinPE сбрасывается при каждой перезагрузке, это ваш выбор, если вы хотите отключить изменение после его внесения.

# Disable Left & Right ALT keys and F4
Set-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Keyboard Layout" -name "Scancode Map" -Value ([byte[]](0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0xe0,0x00,0x00,0x00,0x00))

To re-enable Alt + F4 simply delete the "Scancode Map" registry value and reboot again.

Я нашел ответ здесь: http://www.edugeek.net/forums/windows-server-2008-r2/121900-disable-alt-f4.html

person iNet    schedule 13.11.2020

У вас нет воспроизводимого примера, и я не хочу писать его только для этого, но я думаю, что это может помочь.

$altF4Pressed = {
    [System.Windows.Input.KeyEventArgs]$Alt = $args[1]
    if ( ($Alt.Key -eq 'System') -or ($Alt.Key -eq 'F4') ) {
        if ($_.CloseReason -eq 'UserClosing') {
            $UI.Cancel = $true
            $Alt.Handled = $true
        }
    }
}

$null = $UI.add_KeyDown([System.Windows.Input.KeyEventHandler]::new($altF4Pressed))

Также IIRC для WPF, вы захотите использовать System.Windows.Input, а не System.Windows.Forms, поэтому второй опубликованный вами фрагмент может действительно работать, если вы измените пространство имен.

person PowerShellGuy    schedule 13.11.2020