h41msh1c0r
Goto Top

Powershell GUI immer im Vordergrund

Aloa in die Runde,

Ziel der Übung war es das Fenster immer im Vordergrund zu halten.

Wenn ich mich nicht ganz irre sollte das doch durch das "$Form.TopMost=$true" erledigt werden oder?

Schipsel zum drüberlesen:

[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')|Out-Null  
[System.Reflection.Assembly]::LoadWithPartialName('System.Drawing')|Out-Null  
[Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')|Out-Null  
[System.Windows.Forms.Application]::EnableVisualStyles()|Out-Null

$Form = New-Object System.Windows.Forms.Form
$richTextBox1 = New-Object System.Windows.Forms.RichTextBox


$form_KeyDown=[System.Windows.Forms.KeyEventHandler]{
    #Event Argument: $_ = [System.Windows.Forms.KeyEventArgs]

    if ($_.Alt -eq $true -and $_.KeyCode -eq 'F4') {  
        $script:altF4Pressed = $true;           
    }
}

$form_FormClosing=[System.Windows.Forms.FormClosingEventHandler]{
    #Event Argument: $_ = [System.Windows.Forms.FormClosingEventArgs]

    if ($script:altF4Pressed)
    {
        $_.Cancel = $true
        $script:altF4Pressed = $false;
    }
}

$form.KeyPreview = $True 

$form.add_KeyDown($form_KeyDown)
$form.add_FormClosing($form_FormClosing)


$pathFinal=($env:SystemDrive)+'\Temp\Meldung.rtf'  


$form.FormBorderStyle = 'FixedSingle'  
$Form.Text='Installation'  
$Form.maximumsize=New-Object System.Drawing.Size(780,380)
$Form.minimumsize=New-Object System.Drawing.Size(780,380)
$Form.startposition='centerscreen'  
$Form.ControlBox=$false
$Form.MinimizeBox=$false
$Form.MaximizeBox = $false
$Form.TopMost=$true
$Form.ShowInTaskbar=$false

$richTextBox1.Size=new-object System.Drawing.Size(710,250)
$richTextBox1.Location=new-object System.Drawing.Size(35,25)
$richTextBox1.Rtf=[System.IO.FILE]::ReadAllText($pathFinal)
$richTextBox1.ForeColor='Black' ;$richTextBox1.BorderStyle='none'  
$richTextBox1.Enabled=$false;$Form.Controls.Add($richTextBox1)
$progressBar1=New-Object System.Windows.Forms.ProgressBar
$progressBar1.Name='progressBar1';$progressBar1.Style='Marquee'  
$progressBar1.Left=35
$progressBar1.Top=300
$progressBar1.Width=710
$form.Controls.Add($progressBar1)
$form.Focus()|out-null
$Form.Add_Shown({$Form.Activate()})

$Form.ShowDialog()

VG

Content-Key: 398286

Url: https://administrator.de/contentid/398286

Printed on: September 24, 2023 at 15:09 o'clock

Mitglied: 137846
137846 Jan 15, 2019 updated at 15:39:24 (UTC)
Goto Top
Schipsel zum drüberlesen:
Und?? Dann mach doch.
Member: H41mSh1C0R
H41mSh1C0R Jan 15, 2019 updated at 15:40:43 (UTC)
Goto Top
Na das TopMost geht bei mir nicht. =) (Frage ist über dem "Schnipsel zum drüberlesen" ^^)
Mitglied: 137846
Solution 137846 Jan 15, 2019 updated at 15:44:13 (UTC)
Goto Top
Member: H41mSh1C0R
H41mSh1C0R Jan 15, 2019 updated at 15:49:39 (UTC)
Goto Top
Hmmmmm

mit

$Form.WindowState = 'Maximized'  

klappt es zwar allerdings ignoriert er danach das centerposition. =)
Er schiebt dann das Fenster oben links in die Ecke.

Mit dem WS_EX_TOPMOST bin ich grad etwas überfordert.
Mitglied: 137846
Solution 137846 Jan 15, 2019 updated at 15:56:47 (UTC)
Goto Top
Zitat von @H41mSh1C0R:
Mit dem WS_EX_TOPMOST bin ich grad etwas überfordert.
Hier dein Wrapper zum Topmost machen der rest sollte klar sein wenn man die Parameter im Link liest
$global:tools = Add-Type –MemberDefinition '  
   [DllImport("user32.dll")] public static extern bool SetWindowPos(IntPtr hWnd,IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);  
' -name "windowtools" -namespace W32 –passThru -EA SilentlyContinue  
Sollst ja auch noch was von lernen face-wink
Member: H41mSh1C0R
H41mSh1C0R Jan 15, 2019 at 16:00:44 (UTC)
Goto Top
*=)

Also um auf die Ursprungsfrage zurück zu kommen, das geht von Hause aus nicht und es muss die Funktion SetWindowPos direkt angesprochen werden?

ds

*schulbank drück*
Mitglied: 137846
Solution 137846 Jan 15, 2019 updated at 16:13:15 (UTC)
Goto Top
Zitat von @H41mSh1C0R:
Also um auf die Ursprungsfrage zurück zu kommen, das geht von Hause aus nicht und es muss die Funktion SetWindowPos direkt angesprochen werden?
Besser ist das, denn jede andere Anwendung kann für sich aus auch das Flag setzen um sich damit TOPMOST zu machen.
Wenn die Parent-Anwendung nicht der Desktop ist ist das Fenster nur von diesem Prozess Topmost und nicht vom Desktop.
Member: H41mSh1C0R
H41mSh1C0R Jan 15, 2019 at 16:16:09 (UTC)
Goto Top
dat lüppt, danke

$Handle = $Form.Handle
$global:tools::SetWindowPos($Handle,-1,100,100,0,0,0x0040)