powershell函数中的非模态表单创建

时间:2012-08-14 15:48:50

标签: .net winforms powershell

Powershell 2中是否有办法创建非模态Windows.Form / Dialog?表单应在函数内创建并保持打开状态直到手动关闭。但是,必须继续执行该功能。甚至可以使表单保持打开状态,即使任何脚本的执行完成并且用户返回到交互模式也是如此。

我试过这样,但它甚至没有用start-job创建表单。直接调用makeform,但效果与预期的一样。

function makeform { 
        [void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
        [System.Windows.Forms.Application]::EnableVisualStyles();

        $form = New-Object Windows.Forms.Form
        $form.Text = 'Test Form'

        $form.Add_Shown({$form.Activate()})
        $form.ShowDialog()
}

function show  {
    start-job { makeform }
}

show  # does show nothing :| (expected the form to appear) 

start-job { makeform } -Name 'myjob' # expect the form to appear here - but it doesn't either :| 
Write-Host "Cont..."
# simulate some long running task 
[Threading.Thread]::Sleep(10000)

Wait-job myjob
Remove-job myjob
Write-Host "Done..."
Get-Job

我正在使用.NET 4(通过配置)运行Powershell 2,以防它很重要。非常感谢!

1 个答案:

答案 0 :(得分:1)

工作方法是正确的,但你有一个错误。作业在一个全新的范围内运行,不会继承当前作用域中定义的任何变量或函数。因此,您的工作不知道函数makeform。你可以在这里验证:

Start-Job { makeform } | Wait-Job | Receive-Job

一些解决方法:

在脚本块中声明makeform,并将该块作为-InitializationScript

传递
$lib = {
  function makeform {     
          [void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")    
          [System.Windows.Forms.Application]::EnableVisualStyles();    

          $form = New-Object Windows.Forms.Form    
          $form.Text = 'Test Form'    

          $form.Add_Shown({$form.Activate()})    
          $form.ShowDialog()    
  }
}

Start-Job { makeform } -InitializationScript $lib

或者您可以将makeform函数本身的脚本块作为作业内容传递:

Start-Job $function:makeform

参见问题In PowerShell Form.Show() does not work right, but Form.ShowDialog() does