peterz
Goto Top

Cursor Focus mal da - mal nicht

Hallo,
ich habe ein Powershell Script, welches mir AD-Benutzer anlegt. Die Eingabe von Benutzernamen erfolgt durch eine TextBox, wobei auf dem ersten Eingabefeld (hier Vorname) der Cursor Focus liegt (ist blau markiert).

Jetzt mein Problem.

Startet man das Script innerhalb von PowerShell ISE, ist der Cursor Focus gesetzt.
Öffnet man nur Powershell und navigiert zum Script und starte das Script, ist der der Cursor Focus auch gesetzt.
Starte ich das Script mit einem Doppelklick, startet das Script aber es ist kein Cursor Focus auf dem ersten Eingabefeld.

Woran kann es liegen, dass sich das Script in Abhängigkeit der Startart anders verhält?

Gruß
Peter

Content-Key: 355848

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

Ausgedruckt am: 19.03.2024 um 08:03 Uhr

Mitglied: 134464
134464 23.11.2017 aktualisiert um 10:39:56 Uhr
Goto Top
ist der der Cursor Focus auch gesetzt.
Einen Cursor Focus gibt es nicht, ein Feld/Button/Steuerelement kann den Fokus haben oder nicht, kein Cursor!
Woran kann es liegen, dass sich das Script in Abhängigkeit der Startart anders verhält?
Es kennt keiner dein Skript!
Starte ich das Script mit einem Doppelklick
Wie das? Hast du es als EXE kompiliert, oder die Explorer Dateierweiterungsaktion angepasst damit ein Doppelklick das Skript startet? Wenn ja wie sieht deine Befehlszeile aus?

Eine Powershell-Konsole und eine GUI sind zwei paar Schuhe, blende die Powershell-Konsole via WIN32API vorher aus.
Mitglied: Peterz
Peterz 23.11.2017 um 11:19:17 Uhr
Goto Top
Einen Cursor Focus gibt es nicht, ein Feld/Button/Steuerelement kann den Fokus haben oder nicht, kein Cursor!
Ok, ok, ich habe versucht es "bildlich" darzustellen.

Starte ich das Script mit einem Doppelklick
Ich habe die Explorer Dateierweiterungsaktion angepasst.

blende die Powershell-Konsole via WIN32API vorher aus.
Wie kann ich mit der Win32Api die Konsole ausblenden?

Ich kenn nur den Befehl.
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Hidden & "PfadScript\Script.ps1"
Rufe ich das Script so auf, erscheint auch kein Focus.

Den Focus erzeuge ich mit dem Befehl: "$objForm.Add_Shown({$objForm.Activate(); $objVornameBox.focus()})"
Mitglied: colinardo
colinardo 23.11.2017 aktualisiert um 11:23:15 Uhr
Goto Top
Servus Peter,
Ich kenn nur den Befehl.
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Hidden & "PfadScript\Script.ps1"
Das ist dein Problem face-wink, lass das weg.
Setze folgendes an den Anfang deines Skripts
$showWindowAsync = Add-Type –memberDefinition @"   
[DllImport("user32.dll")]   
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); 
"@ -name "Win32ShowWindowAsync" -namespace Win32Functions –passThru  
[void]$showWindowAsync::ShowWindowAsync((Get-Process –id $pid).MainWindowHandle, 0) 
Grüße Uwe
Mitglied: Peterz
Peterz 23.11.2017 um 11:43:58 Uhr
Goto Top
Setze folgendes an den Anfang deines Skripts
Das hat leider keinen Erfolg gebracht.

Beim Starten des Scripts mittels Doppelklick wird immer noch kein Focus gesetzt, starte ich das Script aus der Powershell direkt, ist der Focus da.
Müssen vielleicht beim Starten per Doppelklick noch Frameworks oder Module geladen werden?
Mitglied: 134464
134464 23.11.2017 aktualisiert um 11:58:32 Uhr
Goto Top
Welches OS?
Hier geht das problemlos. Win10 als auch Win7.
Wie sieht deine Modifikation per Doppelklick aus.

Meinst du vielleicht das das ganze Fenster nicht aktiv ist??
Mitglied: colinardo
colinardo 23.11.2017 aktualisiert um 13:11:26 Uhr
Goto Top
Zitat von @134464:
Hier geht das problemlos. Win10 als auch Win7.
Kann ich bestätigen
Meinst du vielleicht das das ganze Fenster nicht aktiv ist??
Wenn das der Fall sein sollte, funkt dir da eine andere Anwendung rein.

In dem Fall sollte das hier helfen
$showWindowAsync = Add-Type –memberDefinition @"   
[DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);  
[DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd);  
 
"@ -name "Win32ShowWindowAsync" -namespace Win32Functions –passThru  
[void]$showWindowAsync::ShowWindowAsync((Get-Process –id $pid).MainWindowHandle, 0) 

#Generated Form Function
function GenerateForm {

#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  
#endregion

#region Generated Form Objects
$objForm = New-Object System.Windows.Forms.Form
$label2 = New-Object System.Windows.Forms.Label
$label1 = New-Object System.Windows.Forms.Label
$objNachnameBox = New-Object System.Windows.Forms.TextBox
$objVornameBox = New-Object System.Windows.Forms.TextBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects
$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
	$objForm.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 85
$System_Drawing_Size.Width = 224
$objForm.ClientSize = $System_Drawing_Size
$objForm.DataBindings.DefaultDataSourceUpdateMode = 0
$objForm.Name = "objForm"  
$objForm.Text = "Demo"  
$objForm.add_Load({
    $objVornameBox.Focus()
    $objVornameBox.SelectAll()
})
$objForm.add_Shown({
    [void]$showWindowAsync::SetForegroundWindow($objForm.Handle) 
    $objVornameBox.Focus()
    $objVornameBox.SelectAll()
})
$label2.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 3
$System_Drawing_Point.Y = 38
$label2.Location = $System_Drawing_Point
$label2.Name = "label2"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 72
$label2.Size = $System_Drawing_Size
$label2.TabIndex = 3
$label2.Text = "Nachname"  

$objForm.Controls.Add($label2)

$label1.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 3
$System_Drawing_Point.Y = 15
$label1.Location = $System_Drawing_Point
$label1.Name = "label1"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 52
$label1.Size = $System_Drawing_Size
$label1.TabIndex = 2
$label1.Text = "Vorname"  

$objForm.Controls.Add($label1)

$objNachnameBox.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 81
$System_Drawing_Point.Y = 38
$objNachnameBox.Location = $System_Drawing_Point
$objNachnameBox.Name = "objNachnameBox"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 100
$objNachnameBox.Size = $System_Drawing_Size
$objNachnameBox.TabIndex = 1

$objForm.Controls.Add($objNachnameBox)

$objVornameBox.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 81
$System_Drawing_Point.Y = 12
$objVornameBox.Location = $System_Drawing_Point
$objVornameBox.Name = "objVornameBox"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 100
$objVornameBox.Size = $System_Drawing_Size
$objVornameBox.TabIndex = 0
$objVornameBox.Text = "Max"  

$objForm.Controls.Add($objVornameBox)

#endregion Generated Form Code

#Save the initial state of the form
$InitialFormWindowState = $objForm.WindowState
#Init the OnLoad event to correct the initial state of the form
$objForm.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$objForm.ShowDialog()| Out-Null

} #End Function

#Call the Function
GenerateForm
Mitglied: Peterz
Peterz 23.11.2017 um 13:06:50 Uhr
Goto Top
Welches OS?
Windows Server 2012R2

Meinst du vielleicht das das ganze Fenster nicht aktiv ist??
Nein. Das Script ruft eine Eingabebox mit vier Feldern auf, bei dem das erste Eingabefeld markiert sein soll, damit ich nicht mit der Maus erst hineinklicken muss.

Starte ich das Script mit einem Doppelklick oder mit dem Explorer Kontextmenü "Öffnen mit - Windows Powershell" wird das erste Eingabefeld nicht markiert/kein Focus drauf.

Starte ich zuerst Powershell und navigiere (cd\pfad\..) zu dem Script und starte es aus Powershell heraus, dann ist das erste Eingabefeld markiert und ich muss nicht mit der Maus erst hineinklicken.

Das verwundert mich, da es ja das gleiche Script ist.
Wenn es bei euch aber immer funktioniert, egal wie ein Script aufgerufen wird, dann muss es wahrscheinlich an meiner Umgebung liegen.
Mal sehen ob ich noch etwas herausbekommen kann.