我正在尝试创建一个后台工作程序,用于扫描USB设备的更改。
我很难尝试控制运行空间之外的WMI事件。
基本上,当我关闭窗口时(AKA"表格")我想取消Wait-Event
。但我无法控制它在运行空间旁边,所以它被卡住了。
有可能吗?
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form1 = New-Object System.Windows.Forms.Form
$form1.Text = "My PowerShell Form"
$form1.Name = "form1"
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 1400
$System_Drawing_Size.Height = 600
$form1.ClientSize = $System_Drawing_Size
$Global:x = [Hashtable]::Synchronized(@{})
$x.Host = $Host
$x.Flag = $true
$rs = [RunspaceFactory]::CreateRunspace()
$rs.ApartmentState, $rs.ThreadOptions = "STA", "ReUseThread"
$rs.Open()
$rs.SessionStateProxy.SetVariable("x",$x)
$cmd = [PowerShell]::Create().AddScript({
Register-WmiEvent -Class Win32_DeviceChangeEvent -SourceIdentifier volumeChange
do {
$retEvent = Wait-Event -SourceIdentifier volumeChange
Remove-Event -SourceIdentifier volumeChange
} while ($x.Flag) #Loop until next event
Unregister-Event -SourceIdentifier volumeChange
})
$cmd.Runspace = $rs
$handle = $cmd.BeginInvoke()
$OnClosing = {
$x.Flag = $false
$x.Host.UI.WriteVerboseLine($x.Flag)
$cmd.EndInvoke($handle)
}
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.Add_Load($OnLoadForm_StateCorrection)
$form1.Add_Closing($OnClosing)
$form1.ShowDialog() | Out-Null