Как отобразить окно изображения с GUI в форме windows с помощью Powershell? - PullRequest
0 голосов
/ 07 мая 2020

Я хочу показать окно с картинками, но оно не отображается, когда я использую form.show (). Но если я перейду на Form.showdialog, окно с картинками будет отображаться, но процесс не может продолжаться, пока я не закрою GUI. Изображение коробки отображается, но оно не движется, оно застряло, как изображение.

Function Handling
{

    $Form.Close()
    $Form.Dispose()
    $Form = New-Object system.Windows.Forms.Form
    $Form.ControlBox = $true
    $Form.BackColor = "#d0021b"
    $Form.WindowState = "Maximized"
    $Form.TopMost = $false
    [void]$Form.Show()

  # Message Box
    [System.Windows.MessageBox]::Show("OK", "[Error]", "0", "Error")
    $ExitCode = "1"
    if($ExitCode -ne "107A")
    {

      $Form.Close()
      $Form.Dispose()
      Exit
    }
    else{

      $Form.Close()
      $Form.Dispose()
      Exit
    }
}

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()
$Form = New-Object system.Windows.Forms.Form
$form.BackgroundImageLayout = 'Center'
$Form.WindowState = 'Maximized'
$Form.BackColor = "#ffffff"

$file2 = Get-ChildItem -Path "D:\3.png"
$cover = [Drawing.Image]::FromFile($file2)
$form.BackgroundImage = $img2

[reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
$file = (get-item 'D:\6.gif')
$img = [System.Drawing.Image]::Fromfile($file)

$pictureBox = new-object Windows.Forms.PictureBox
$pictureBox.Image = $img
$pictureBox.SizeMode = "Autosize"
$pictureBox.Anchor = "Bottom, left"
$Form.controls.add($pictureBox)

[reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
$file3 = (get-item 'D:\6.gif')
$img3 = [System.Drawing.Image]::Fromfile($file3)

$pictureBox2 = new-object Windows.Forms.PictureBox
$pictureBox2.Image = $img3
$pictureBox2.SizeMode = "Autosize"
$pictureBox2.Anchor = "Bottom, right"
$Form.controls.add($pictureBox2)

$form.Show()

Write-Host "next process"
####
# some process
###

Start-Sleep -s 2
Handling

Кто-нибудь может дать мне идею, пожалуйста. Очень признателен за вашу помощь. Спасибо.

1 Ответ

2 голосов
/ 07 мая 2020

Можно вот так попробовать? Поместите фоновую операцию вместо Start-Sleep -s 2, и файл gif по-прежнему будет показывать движение.

$Form = New-Object system.Windows.Forms.Form
$Form.Location= New-Object System.Drawing.Size(100,100)
$Form.Size= New-Object System.Drawing.Size(550,170)
$Form.StartPosition = "Manual"
$Form.Visible=$false
$Form.Enabled = $true
$Form.Add_Shown({$Form.Activate()})

[reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
$file = (get-item 'D:\6.gif')
$img = [System.Drawing.Image]::Fromfile($file);

[System.Windows.Forms.Application]::EnableVisualStyles();

$pictureBox = new-object Windows.Forms.PictureBox
$pictureBox.Location = New-Object System.Drawing.Size(0,1)
$pictureBox.Size = New-Object System.Drawing.Size($img.Width,$img.Height)
$pictureBox.Image = $img
$Form.controls.add($pictureBox)

$WaitForm.Topmost = $True

$rs = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()
$rs.Open()
$rs.SessionStateProxy.SetVariable("Form", $Form)
$data = [hashtable]::Synchronized(@{text=""})
$rs.SessionStateProxy.SetVariable("data", $data)
$p = $rs.CreatePipeline({ [void] $Form.ShowDialog()})
$p.Input.Close()
$p.InvokeAsync()

## Enter the rest of your script here while you want the form to display
Start-Sleep -s 2

$WaitForm.close()
...