如何让PowerShell弹窗强制用户响应,禁止操作其他应用程序?
实现强制响应的BIOS密码修改弹窗(锁定系统操作直到用户响应)
要让用户必须响应弹窗才能操作其他程序,核心是将弹窗设置为系统级模态窗口,阻止所有非弹窗的操作。以下是修改后的完整脚本,以及关键修改说明:
修改后的完整脚本
Add-Type -AssemblyName System.Windows.Forms # 添加DefaultDesktopOnly参数,将弹窗设为系统级模态,强制用户响应 $result = [System.Windows.Forms.MessageBox]::Show( "是否要修改BIOS密码?", "BIOS密码修改", [System.Windows.Forms.MessageBoxButtons]::OKCancel, [System.Windows.Forms.MessageBoxIcon]::Question, [System.Windows.Forms.MessageBoxDefaultButton]::Button1, [System.Windows.Forms.MessageBoxOptions]::DefaultDesktopOnly ) if ($result -eq [System.Windows.Forms.DialogResult]::OK) { $form = New-Object System.Windows.Forms.Form $form.Text = "修改BIOS密码" $form.Size = New-Object System.Drawing.Size(320,220) $form.StartPosition = "CenterScreen" # 设置窗口始终置顶,确保用户无法忽略 $form.TopMost = $true $labelOld = New-Object System.Windows.Forms.Label $labelOld.Location = New-Object System.Drawing.Point(10,20) $labelOld.Size = New-Object System.Drawing.Size(280,20) $labelOld.Text = "输入旧BIOS密码:" $form.Controls.Add($labelOld) $textboxOld = New-Object System.Windows.Forms.TextBox $textboxOld.Location = New-Object System.Drawing.Point(10,40) $textboxOld.Size = New-Object System.Drawing.Size(260,20) $form.Controls.Add($textboxOld) $labelNew = New-Object System.Windows.Forms.Label $labelNew.Location = New-Object System.Drawing.Point(10,70) $labelNew.Size = New-Object System.Drawing.Size(280,20) $labelNew.Text = "输入新BIOS密码:" $form.Controls.Add($labelNew) $textboxNew = New-Object System.Windows.Forms.TextBox $textboxNew.Location = New-Object System.Drawing.Point(10,90) $textboxNew.Size = New-Object System.Drawing.Size(260,20) $form.Controls.Add($textboxNew) $button = New-Object System.Windows.Forms.Button $button.Location = New-Object System.Drawing.Point(75,130) $button.Size = New-Object System.Drawing.Size(75,23) $button.Text = "确定" $button.DialogResult = [System.Windows.Forms.DialogResult]::OK $form.Controls.Add($button) $form.Add_Shown({ $textboxOld.Select() }) $form.AcceptButton = $button # 以系统模态方式显示窗口,确保用户必须处理才能操作其他程序 $result = $form.ShowDialog([IntPtr]::Zero) if ($result -eq [System.Windows.Forms.DialogResult]::OK) { $oldPassword = $textboxOld.Text $newPassword = $textboxNew.Text (gwmi -Class Lenovo_SetBiosPassword -Namespace root\wmi).SetBiosPassword("pap,$oldPassword,$newPassword,ascii,us") # 提示弹窗同样设置为系统模态 [System.Windows.Forms.MessageBox]::Show( "请重启设备以生效", "操作完成", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Exclamation, [System.Windows.Forms.MessageBoxDefaultButton]::Button1, [System.Windows.Forms.MessageBoxOptions]::DefaultDesktopOnly ) } else { [System.Windows.Forms.MessageBox]::Show( "密码修改已取消", "操作取消", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Exclamation, [System.Windows.Forms.MessageBoxDefaultButton]::Button1, [System.Windows.Forms.MessageBoxOptions]::DefaultDesktopOnly ) } } else { [System.Windows.Forms.MessageBox]::Show( "密码修改已取消", "操作取消", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Exclamation, [System.Windows.Forms.MessageBoxOptions]::DefaultDesktopOnly ) }
关键修改说明
- 系统模态弹窗参数:给所有
MessageBox.Show添加[System.Windows.Forms.MessageBoxOptions]::DefaultDesktopOnly参数,该参数会让弹窗显示在系统默认桌面,并且强制用户必须响应弹窗才能操作任何其他窗口。 - 置顶窗口设置:给自定义的密码输入Form添加
$form.TopMost = $true,确保窗口始终显示在所有窗口最上层,无法被其他窗口遮挡。 - 系统模态显示Form:使用
$form.ShowDialog([IntPtr]::Zero)替代原有的$form.ShowDialog(),将Form设置为系统级模态窗口,进一步确保用户无法切换到其他应用。
内容的提问来源于stack exchange,提问作者user26675830
相关产品推荐
相关产品推荐

