joe2017
Goto Top

Powershell start-process osk.exe in gewünschter Größe (width, height)

Hallo zusammen,

ich bin auf der Suche die osk.exe in einer definierten Größe mittels Powershell zu öffnen.
Ich hab zwar gefunden wie ich powershell in einer Größe öffnen kann, aber osk funktioniert damit leider nicht.
start-process powershell '-noexit -command "[console]::windowwidth=200; [console]::windowheight=50; [console]::bufferwidth=[console]::windowwidht"'  

Hat jemand eine Idee wie das funktionieren könnte.

Vielen Dank.

Content-ID: 1223627953

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

Ausgedruckt am: 21.11.2024 um 18:11 Uhr

149062
149062 03.09.2021 aktualisiert um 11:26:54 Uhr
Goto Top
Das OSK Window ist da etwas speziell, seine Eigenschaften lassen sich nur verändern wenn der Skript-Prozess elevated ausgeführt wird. Dann kann man mittels https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-se ... arbeiten wie bei deiner letzten Frage gezeigt.
colinardo
Lösung colinardo 03.09.2021 aktualisiert um 12:52:56 Uhr
Goto Top
Servus,
wie @149062 schon angemerkt hat die osk.exe ist da etwas speziell weil OSK das Flag UIAccess="true" in seinem Manifest gesetzt hat und so mit etwas höherer Integrität läuft als normal, deswegen braucht man entweder elevated rights für die remote Manipulation des Fensters oder muss für seine Anwendung die Integritätsstufe im Manifest auf UIAccess="true" setzen, zusätzlich die Anwendung signieren und im ProgramFiles-Ordner oder einem Ordner mit entsprechender Integritätsstufe platzieren.

# restart script elevated if not
if(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(544)){start powershell -Verb runas -ArgumentList '-File',$MyInvocation.MyCommand.Definition;exit}  
# load SetWindosPos win32 function
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 Tools -namespace win32  
# start osk.exe
$osk = start osk.exe -PassThru
# wait until osk window handle exists
while($osk.MainWindowHandle -eq [IntPtr]::Zero){
    $osk.Refresh()
    sleep .5
}
# set window position and size (x= 100, y = 100, width = 600, height 300), see https:{{comment_single_line_double_slash:0}}
[Win32.Tools]::SetWindowPos($osk.MainWindowHandle,0,100,100,600,300,0x0040)
Grüße Uwe
joe2017
joe2017 03.09.2021 um 11:47:58 Uhr
Goto Top
Danke, dann werde ich wohl darauf verzichten müssen.

Mit deinem Script werden Admin Privilegien benötigt.

Aber trotzdem vielen Dank
colinardo
colinardo 03.09.2021 aktualisiert um 12:58:58 Uhr
Goto Top
Zitat von @joe2017:
Mit deinem Script werden Admin Privilegien benötigt.
Hatte ich ja geschrieben face-smile. Alternativ Anwendung signieren, Manifest anpassen und Anwendung in einem entsprechenden Ordner mit passender Integritätsstufe platzieren (ProgramFiles). Oder einen Dienst oder Scheduled Task erledigen lassen. Sollte aber auch genügend MultiScreen Software geben die die Positionierung gleich mit erledigt.
Aber trotzdem vielen Dank
Gerne.