winforms 在PowerShell窗体上,使Shift+鼠标单击的操作类似于文件资源管理器

xpcnnkqh  于 2023-03-09  发布在  Shell
关注(0)|答案(1)|浏览(126)

我有一个带有复选框的表单,它工作得很好,我可以根据需要显示我想要的所有项目,然后选择我想要的带有复选框的项目,然后当我按OK时,返回一个数组,我可以操作它。
我已经得到了CTRL+A的工作,以选择所有,和CTRL+D取消选择所有。

# Add the KeyDown event handler, used for CTRL+A (select all) / CTRL+D (deselect all)
$form.KeyPreview = $true
$form.Add_KeyDown({
    param($checkboxSender, $checkboxEventArgs)
    if (($checkboxEventArgs.KeyCode -eq "A") -and ($checkboxEventArgs.Control)) {
        foreach ($control in $panel.Controls) {
            $control.Checked = $true
        }
    }
    if (($checkboxEventArgs.KeyCode -eq "D") -and ($checkboxEventArgs.Control)) {
        foreach ($control in $panel.Controls) {
            $control.Checked = $false
        }
    }
})

然后,在创建表单项的循环中,我放入:

if (($eventArgs.KeyCode -eq "A") -and ($eventArgs.Control)) {
    foreach ($control in $panel.Controls) {
        $control.Checked = $true
    }
}
if (($eventArgs.KeyCode -eq "D") -and ($eventArgs.Control)) {
    foreach ($control in $panel.Controls) {
        $control.Checked = $false
    }
}

然而,我无法让SHIFT+mouselick按我想要的方式操作,这就像文件资源管理器(即选中复选框选择一个项目,然后转到另一个项目并使用SHIFT+ mouselick,第一个到第二个之间的每个项目都将被选中)。

# Define the lastSelected variable
$lastSelected = $null

$checkboxMouseDown = {
    param($sender, $eventArgs)

    $checkbox = $sender
    $isChecked = $checkbox.Checked

    if ([System.Windows.Forms.Control]::ModifierKeys -band [System.Windows.Forms.Keys]::Shift) {
        if ($lastSelected -and $lastSelected -ne $checkbox) {
            $startIndex = [System.Array]::IndexOf($panel.Controls, $lastSelected)
            $endIndex = [System.Array]::IndexOf($panel.Controls, $checkbox)

            if ($startIndex -gt $endIndex) {
                $startIndex, $endIndex = $endIndex, $startIndex
            }

            for ($i = $startIndex; $i -le $endIndex; $i++) {
                $panel.Controls[$i].Checked = $isChecked
            }
        }
    } else {
        $lastSelected = $checkbox
    }
    Write-Host "Last selected: $lastSelected, Checked: $($checkbox.Checked)"
}

然后在构建表单的foreach循环中,我有:

$panel.Add_MouseDown($checkboxMouseDown)

我自己解决了大部分问题(我不太擅长表单),但在过去的两天里我还没有找到解决这个问题的方法。如果能帮助我让Shift+鼠标点击以这种方式工作,我将不胜感激。

pbwdgjma

pbwdgjma1#

挖掘了一下,我也想不出答案,不过,最后偶然发现了这篇文章:https://learn.microsoft.com/en-us/powershell/scripting/samples/multiple-selection-list-boxes?view=powershell-7.3
我不能让它与我写的脚本一起工作,但是,我复制了他们的代码并运行它,它确实做了你想要的。我按下shift+左键单击,它选择了多个项目。我很确定$listBox.SelectionMode = 'MultiExtended'行是什么使它成为可能。无论如何,希望这有帮助,如果没有,对不起。
编辑:我没有给你找到一个答案,这让我很困扰,所以这里有一个更好的答案。

Add-Type -AssemblyName System.Windows.Forms

$form = New-Object System.Windows.Forms.Form
$form.KeyPreview = $true

$form.Add_KeyDown({
    if ($_.Shift -and ([System.Windows.Forms.UserControl]::MouseButtons -eq "Left")){
        Write-Host "Shift-click detected"
    }
})

这对我来说没问题。

相关问题