在Powershell中创建弹出消息 [英] Create a popup message in Powershell

查看:99
本文介绍了在Powershell中创建弹出消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个允许我弹出的功能,请稍等消息,再运行一些脚本,然后关闭弹出窗口

I'm attempting to make a function that will allow me to popup a please wait message run some more script then close the popup

Function Popup-Message {

    param ([switch]$show,[switch]$close)

    Add-Type -AssemblyName System.Windows.Forms  

    # Build Form
    $objForm = New-Object System.Windows.Forms.Form
    $objForm.Text = "Test"
    $objForm.Size = New-Object System.Drawing.Size(220,100)

    # Add Label
    $objLabel = New-Object System.Windows.Forms.Label
    $objLabel.Location = New-Object System.Drawing.Size(80,20) 
    $objLabel.Size = New-Object System.Drawing.Size(100,20)
    $objLabel.Text = "Hi there!"
    $objForm.Controls.Add($objLabel)



    If ($show)
    {
        $objForm.Show() | Out-Null
        $global:test = "Show"
    }


    If ($close)
    {
        # destroy form
        $objForm.Close() | Out-Null
        $global:test = "Close"
    }
}

然后我可以通过以下方式显示弹出窗口:

I can then get the popup to display by:

Popup-Message -show

这时,我可以看到 $ test 变量为显示

At this point I can see the $test variable as Show

但是当我尝试使用以下方法关闭窗口时:

But when I try to close the window with:

Popup-Message -close

但是弹出窗口不会关闭如果我再次查看 $ test ,它将显示为关闭

But the popup window will not close If I look at $test again it will show as Close

我假设这与将函数保留在Global Scope中有关,但是我不知道如何使用表单

I'm assuming this has something to do with keeping the function in the Global Scope but I can't figure out how to do this with the form

推荐答案

kpogue的有用答案可以很好地说明您的问题并提供一种有效的解决方案,但由于依赖全局变量而不够理想.

kpogue's helpful answer explains your problem well and offers a solution that is effective, but suboptimal due to relying on global variables.

让我建议一种不同的方法,在该方法中,您使用函数简单地定义表单并返回该定义,您可以在其中调用 .Show() .Close() 方法 ,但请注意, .Show()方法通过 添加成员 包含对 [System.Windows.Forms.Application] :: DoEvents()的调用,以确保正确绘制表单.

Let me suggest a different approach, where you use a function to simply define the form and return that definition, on which you can call the .Show() and .Close() methods as needed, but note that the .Show() method is overridden via Add-Member to include a call to [System.Windows.Forms.Application]::DoEvents(), so as to ensure that the form is properly drawn.

function New-PopUpForm {

  Add-Type -AssemblyName System.Windows.Forms  

  # Create the form.
  $objForm = New-Object System.Windows.Forms.Form -Property @{
    Text            = "Test"
    Size            = New-Object System.Drawing.Size 220, 100
    StartPosition   = 'CenterScreen' # Center on screen.
    FormBorderStyle = 'FixedSingle'  # fixed-size form
    # Remove interaction elements (close button, system menu).
    ControlBox      = $false
  }

  # Create a label...
  $objLabel = New-Object System.Windows.Forms.Label -Property @{
    Location = New-Object System.Drawing.Size 80, 20
    Size     = New-Object System.Drawing.Size 100, 20
    Text     = "Hi there!"
  }

  # ... and add it to the form.
  $objForm.Controls.Add($objLabel)

  # Override the `.Show()` method to include
  # a [System.Windows.Forms.Application]::DoEvents(), so as 
  # to ensure that the form is properly drawn.
  $objForm | Add-Member -Force -Name Show -MemberType ScriptMethod -Value {
    $this.psbase.Show() # Call the original .Show() method.
    # Activate the form (focus it).
    $this.Activate()
    [System.Windows.Forms.Application]::DoEvents() # Ensure proper drawing.
  }

  # Since this form is meant to be called with .Show() but without 
  # a [System.Windows.Forms.Application]::DoEvents() *loop*, it
  # it is best to simply *hide* the cursor (mouse pointer), so as not
  # to falsely suggest that interaction with the form is possible
  # and so as not to end up with a stuck "wait" cursor (mouse pointer) on 
  # the first instantiation in a session.
  [System.Windows.Forms.Cursor]::Hide()

  # Return the form.
  return $objForm
}

然后可以按如下方式使用该功能:

You can then use the function as follows:

$form = New-PopupForm

$form.Show() 

# ...

$form.Close()

注意:

  • 一旦调用 .Close(),存储在 $ form 中的表单实例将被处理并且无法重复使用-只需调用 New-再次使用PopupForm 创建一个新实例.

  • Once you call .Close(), the form instance stored in $form is disposed of and cannot be reused - simply call New-PopupForm again to create a new instance.

如果运行您的脚本 的PowerShell会话退出,则该会话中创建的所有弹出窗口都会自动关闭.

If the PowerShell session running your script exits, any pop-up windows created in the session close automatically.

注意事项:

  • 请注意,由于使用 .Show()方法(无需额外的努力),用户将无法进行交互并带有弹出窗口,尤其是甚至没有为了移动窗口或手动关闭窗口.

  • Note that, due to use of the .Show() method (without additional effort), the user won't be able to interact with the pop-up window, notably not even in order to move the window or close it manually.

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆