Zu bestimmtem Prozess wechseln über CMD?

1 Antwort

Du willst einen laufenden Prozess in den Vordergrund bringen.

Batch cmd hat dafür keine native Methode. Alte Workarounds via VBScripts .Appactivate funktionieren auch nicht mehr reibungslos unter dem neuen Fenstermanagment von Windows 10.

Folglich kann man nur über die SystemAPI von Windows noch direkten Einfluss auf Systemkomponenten nehmen. Dazu sind jedoch Programmiersprachen nötig welche diese Ansprechen können (C++,C#,Java,Python usw). Powershell kann C#-Code einbinden und auf diesem Wege als Scriptsprache auf das System zugreifen.

Es läuft ein Programm, in welchem diese Batch aufgerufen wird um ein anderes Programm in den Vordergrund zu holen.

Häää? Warum denn das? Das hat etwas von "Hans im Glück" , Du tauscht einen Goldklumpen gegen einen Stein... Batch kann weniger als die Sprache in der höchstwahrscheinlich das aufrufende Programm abgefasst ist! Warum rufst Du nicht einfach die API-Funktion zur Fenstersteuerung direkt im Programm auf?

Ich kenne viele Anfänger, welche aus Unkenntnis aus Java, C++ oder anderen Hochsprachen die Console aufrufen. Das ist so ineffizient wie die humpelnde Oma eine Pizza abholen zu lassen...

Egal...

Das folgende PowershellScript bringt ein Chrome-Fenster in den Vordergrund.

  #erzeuge C#Funktion zum Umschalten des Fenstermodus (fies:definiert als void statt normalerweise boolean, unterdrückt Rückmeldung)
$user32=Add-Type -MemberDefinition '[DllImport("user32.dll")] public static extern void ShowWindow(IntPtr hWnd, int nCmdShow);' -Name myAPI -passthru
 #ermittle Windowhandle der angegebenen Anwendung
$hwnd = (Get-Process chrome |? {$_.MainWindowTitle}|select -last 1).MainWindowHandle
 #Tricky: damit das Zielfenster eine Zustandsänderung wahrnimmt muss dieser sich auch wirklich ändern!
 #...daher: kurz minimieren 2 und ursprünglichen Zustand aber activiert Herstellen
 #einige Fensterzustands-Konstanten: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow
2,10|%{$user32::ShowWindow($hwnd, $_)}
pause

...ich mache keine Fehlerbehandlung hier geht's um's Prinzip (hübsch kostet extra). Wenn mehrere Chrome-Fenster offen stehen/oder keines , gibt's Konflikte . Hidden-Fenster haben prinzipiell hwnd (Fensterhandle)=0.

Hier noch das ganze als Powershell Kommandozeilenscript zum direkten (Shell)Aufruf

powershell "$user32=Add-Type -MemberDefinition '[DllImport("""user32.dll""")] public static extern void ShowWindow(IntPtr hWnd, int nCmdShow);' -Name myAPI -passthru;$hwnd = (Get-Process chrome |? {$_.MainWindowTitle}|select -last 1).MainWindowHandle;2,10|foreach{$user32::ShowWindow($hwnd, $_)}"
Ist ein Touch Monitor, daher können wir nicht mit Maus und Tastatur arbeiten.
  • Und wie wechselst Du sonst zwischen Fenstern? ...oder machst Eingaben?
  • Und irgendwie musst Du ja auch Programme starten?
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren