Powershell, Befehle parallel und nicht wartend abarbeiten

JetA1

Cadet 1st Year
Registriert
Aug. 2015
Beiträge
15
Hallo zusammen,
ich möchte in Powershell bei autom. PC-Anmeldung den Bildschirm "schwarz" machen und gleichzeitig weitere Befehle ausführen, anstelle abzuwarten.

Beide Forms werden im Beispielcode erst nach 5 Sek. beendet. Die 5 Sek. werden abgewartet, bis ich unten per rundll32.exe user32.dll,LockWorkStation (Beispiel) den PC sperre.
Ich muss auch zwei Forms bauen, weil mit WindowState = "Maximized" wird die Form nur auf dem primären Bildschirm als Vollbild angezeigt. Außerdem bleibt dabei die Taskleiste "sichtbar" und der ganze Bildschirm wird nicht "verdeckt"
Bei der Sperre baue ich noch eine Prüfung ein, die einen Tastendruck prüft um rauszugehen, und die Tastatureingabe sperrt (läuft bereits)

Gerne auch Alternativen, wie ich bei allen Bildschirmen ein "schwarzes Fenster" anzeigen lassen kann, welches auch die Taskleiste (Vordergrund) verdeckt.

Was muss ich anders machen?

PowerShell:
    Add-Type -AssemblyName System.Drawing
    Add-Type -AssemblyName System.Windows.Forms

    $form = New-Object System.Windows.Forms.Form
    $form.Text = "Fenster1"
    $form.Width = 15000
    $form.Height = 15000
    $form.BackColor = [System.Drawing.Color]::Black
    $form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::None
    $form.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen
    $form.TopMost = $true
    $form.WindowState = "Maximized"

    # Formular 2
    $form2 = New-Object System.Windows.Forms.Form
    $form2.Text = "Fenster2"
    $form2.Width = 15000
    $form2.Height = 15000
    $form2.BackColor = [System.Drawing.Color]::black
    $form2.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::None
    $form2.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen
    $form2.TopMost = $true

    # Timer erstellen
    $timer = New-Object System.Windows.Forms.Timer
    $timer.Interval = 5000  # 5 Sekunden in Millisekunden
    $timer.Add_Tick({
        # Schließe beide Formulare nach 3 Sekunden
        $form.Close()
        $form2.Close()
        $timer.Stop()
    })

    # Timer starten
    $timer.Start()

    # Formulare anzeigen
    $form.Show()
    $form2.Show()

    #hier weiterer Befehl und mehr Prüfungen, z.B.
    rundll32.exe user32.dll,LockWorkStation
 
Zuletzt bearbeitet:
JetA1 schrieb:
# Schließe beide Formulare nach 3 Sekunden
Da schließt gar nichts.

$form.Hide()
und
$form2.Hide()

in beide Formen einbauen.
 
  • Gefällt mir
Reaktionen: areiland
Klar, wäre nur ein komischer Workaround: Könnte eventuell funktionieren, wenn man die Forms per start-job oder start-process jeweils über ein separates Script aus deiner PS starten lässt.
 
Doch mit Clos() schließen sich die Forms. Hide() schließt auch, lässt aber die Powershell-Session nach Beendigung irgendwie offen.

Ich probiere es mal zusätzlich zu starten
 
JetA1 schrieb:
Hide() schließt auch
Die beiden Hides müssen jeweils ans Ende der beiden Form-Objekte:

$form.WindowState = "Maximized"
$form.Hide()

$form2.TopMost = $True
$form2.Hide()

JetA1 schrieb:
Doch mit Clos() schließen sich die Forms.
Bei meinem Test nicht. Die musste ich über den TaskManager abwürgen.
 
Ich habe 0 Ahnung von programmieren, aber ich habe deinen Prompt mal dem Copiloten zum Fressen gegeben, vllt. helfen dir seine Antworten: (Leider weiß ich nicht, wie ich im Forum diese Codeformatierung mache!)

"Um deinen Bildschirm bei der automatischen PC-Anmeldung schwarz zu machen und gleichzeitig weitere Befehle auszuführen, kannst du ein PowerShell-Skript verwenden, das mehrere Fenster auf verschiedenen Bildschirmen erstellt und die Taskleiste verdeckt. Hier ist ein Beispiel, wie du dies umsetzen könntest:

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

# Funktion, um ein schwarzes Fenster zu erstellen
function New-BlackWindow {
param (
[int]$ScreenIndex
)
$form = New-Object Windows.Forms.Form
$form.FormBorderStyle = 'None'
$form.WindowState = 'Maximized'
$form.BackColor = [System.Drawing.Color]::Black
$form.TopMost = $true

# Fenster auf den entsprechenden Bildschirm setzen
$screen = [Windows.Forms.Screen]::AllScreens[$ScreenIndex]
$form.StartPosition = 'Manual'
$form.Left = $screen.Bounds.Left
$form.Top = $screen.Bounds.Top
$form.Width = $screen.Bounds.Width
$form.Height = $screen.Bounds.Height

$form.Show()
return $form
}

# Alle Bildschirme durchgehen und ein schwarzes Fenster erstellen
$forms = @()
[Windows.Forms.Screen]::AllScreens | ForEach-Object {
$forms += New-BlackWindow -ScreenIndex $_.DeviceName
}

# Hier kannst du weitere Befehle ausführen
Start-Sleep -Seconds 5

# Fenster schließen
$forms | ForEach-Object { $_.Close() }

# Sperren des PCs
rundll32.exe user32.dll,LockWorkStation


Dann habe ich ihm dein Powershell-Skript gezeigt:

"Ich sehe ein paar Punkte, die verbessert werden können:

  1. Fenster-Positionierung: Die Formulare werden beide auf dem primären Bildschirm zentriert angezeigt. Um sicherzustellen, dass beide Formulare alle Bildschirme abdecken, musst du deren Position und Größe anpassen.
  2. Formulare anzeigen lassen: Die Verwendung von $form.Show() und $form2.Show() führt dazu, dass die Formulare nicht im Vordergrund bleiben, wenn andere Fenster den Fokus erhalten.
  3. Fehlende Synchronisation: Du möchtest, dass die Sperre und die Anzeigen der Fenster gleichzeitig geschehen. Dies kann durch die Verwendung von Start-Job erreicht werden.
Hier eine verbesserte Version deines Codes:

Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Windows.Forms

function New-BlackWindow {
param (
[string]$Title
)
$form = New-Object System.Windows.Forms.Form
$form.Text = $Title
$form.Width = [System.Windows.Forms.Screen]::AllScreens[0].Bounds.Width
$form.Height = [System.Windows.Forms.Screen]::AllScreens[0].Bounds.Height
$form.BackColor = [System.Drawing.Color]::Black
$form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::None
$form.TopMost = $true
$form.StartPosition = [System.Windows.Forms.FormStartPosition]::Manual
return $form
}

# Fenster für jeden Bildschirm erstellen
$forms = @()
[System.Windows.Forms.Screen]::AllScreens | ForEach-Object {
$screen = $_
$form = New-BlackWindow -Title "Blackout"
$form.Left = $screen.Bounds.Left
$form.Top = $screen.Bounds.Top
$form.Width = $screen.Bounds.Width
$form.Height = $screen.Bounds.Height
$form.Show()
$forms += $form
}

# Timer erstellen und starten
$timer = New-Object System.Windows.Forms.Timer
$timer.Interval = 5000 # 5 Sekunden
$timer.Add_Tick({
$forms | ForEach-Object { $_.Close() }
$timer.Stop()
})

$timer.Start()

# Gleichzeitige Ausführung weiterer Befehle
Start-Job -ScriptBlock {
Start-Sleep -Seconds 5
rundll32.exe user32.dll,LockWorkStation
}


Dieser Code erstellt ein schwarzes Fenster für jeden Bildschirm, das die Taskleiste verdeckt. Der Timer schließt die Fenster nach 5 Sekunden, während Start-Job gleichzeitig den Sperrbefehl ausführt. Ich hoffe, das hilft dir weiter!"
 
DenB schrieb:
Leider weiß ich nicht, wie ich im Forum diese Codeformatierung mache!
Wenn Du im Browser bist, gibts über dem Eingabefeld in dem Du Dein Posting schreibst verschiedene Schaltflächen.
Die mit den 3 Punkten sind auch aufklappbar und da findest Du auch u.a. irgendwo eine Schaltfläche die so aussieht:
</>

Und das ist die, um Quelltext einzufügen. :-)
(gibt da sogar eine Sprachauswahl, so das man Syntaxhighlighting machen kann)
 
  • Gefällt mir
Reaktionen: DenB
Zurück
Oben