joe2017
Goto Top

Powershell if process not running start process else go to process window

Hallo zusammen,

ich habe ein Dashboard mit Windows Form in Powershell erstellt. Hiermit kann der User diverse Anwendungen starten. Jedoch verwende ich immer ein start-process. Somit wird jedes Mal eine neue Instanz geöffnet.

Bsp. start-process calc.exe

Ich würde gerne prüfen ob der Prozess bereits gestartet ist und wenn ja zu diesem Fenster wechseln. Wenn noch nicht geöffnet soll der Prozess starten.
Ob der Prozess gestartet ist kann ich abfragen. Das ist ja kein Problem. Jedoch weiß ich nicht wie ich zu diesem Prozess wechseln kann. Also wie ich das Fenster in den Vordergrund hole.

Kann mir jemand hierbei helfen?

Content-ID: 1224731414

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

Ausgedruckt am: 18.12.2024 um 02:12 Uhr

joe2017
joe2017 04.09.2021 um 06:48:40 Uhr
Goto Top
Guten Morgen zusammen,

ich habe hierzu etwas gefunden:
function Show-Process($Process, [Switch]$Maximize)
{
  $sig = '  
    [DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);  
    [DllImport("user32.dll")] public static extern int SetForegroundWindow(IntPtr hwnd);  
  '  
  
  if ($Maximize) { $Mode = 3 } else { $Mode = 4 }
  $type = Add-Type -MemberDefinition $sig -Name WindowAPI -PassThru
  $hwnd = $process.MainWindowHandle
  $null = $type::ShowWindowAsync($hwnd, $Mode)
  $null = $type::SetForegroundWindow($hwnd) 
}


$var1 = "iexplore"  
$var3 = Get-Process $var1 -ErrorAction SilentlyContinue
if ($var3) {
    Show-Process -Process $var2 -Maximize
}
else {
    $var2 = Start-Process $var1 -WindowStyle Maximize -PassThru
}

Was ist jedoch wenn ich zwei Fenster offen habe?
LinkA und LinkB

Wie kann ich diese unterscheiden???
149062
149062 04.09.2021 aktualisiert um 10:30:10 Uhr
Goto Top
Zitat von @joe2017:
Was ist jedoch wenn ich zwei Fenster offen habe?
LinkA und LinkB

Wie kann ich diese unterscheiden???

FindWindow Methode benutzen um an die HWND des Fensters anhand des Titels zu kommen.
Bei Tabs siehe
URLs geöffneter bzw vorhandener Browsertabs und Browserfenster auslesen

Alternativ mit
gps -Name iexplore | ?{$_.MainWindowTitle -like '*Ttitel der Webseite*'}  
joe2017
joe2017 06.09.2021 aktualisiert um 09:53:21 Uhr
Goto Top
Schönen guten Morgen,

das Problem beim IE ist, das immer nur das zuletzt aktive Fenster einen MainWindowTitle anzeigt.
Get-Process iexplore | select MainWindowTitle

Öffnet man zwei Instanzen Bsp. google und yahoo
Wird mit der Abfrage immer nur eins von beiden angezeigt. Und immer nur den Title den man zuletzt geöffnet hatte.
Gibt es hier noch eine andere möglichkeit?

Nicht nach title sonder nach Link zu suchen? Hiermit finde ich keinen verbrauchbaren Wert...
Get-Process iexplore | select *
joe2017
joe2017 06.09.2021 um 10:15:17 Uhr
Goto Top
Jetzt hatte ich noch eine Idee. Diese funktioniert aber auch leider nicht...
Ich wollte direkt nach dem Starten die ID auslesen und zu einem späteren Zeitpunkt die ID in den Vordergrund holen.
Aber der IE legt den MainWindowTitle immer auf den ersten gestarteten IE!
Start-Process iexplore www.yahoo.de
sleep 1
$id1=Get-Process | Where-Object {$_.MainWindowTitle -match "yahoo"} | Select-Object Id  
echo $id1


Start-Process iexplore www.google.de 
sleep 1
$id2=Get-Process | Where-Object {$_.MainWindowTitle -match "google"} | Select-Object Id  
echo $id2
149062
149062 06.09.2021 aktualisiert um 10:16:31 Uhr
Goto Top
Zitat von @joe2017:

Schönen guten Morgen,

das Problem beim IE ist, das immer nur das zuletzt aktive Fenster einen MainWindowTitle anzeigt.
Get-Process iexplore | select MainWindowTitle

Öffnet man zwei Instanzen Bsp. google und yahoo
Wird mit der Abfrage immer nur eins von beiden angezeigt. Und immer nur den Title den man zuletzt geöffnet hatte.
Gibt es hier noch eine andere möglichkeit?
Du musst beim IE jedes Fenster erst kurz mit SetForeground in den Vordergrund holen um den Titel abzufragen. Das ist dem Grund geschuldet das der IE wie auch andere Browser die Fenster/Tabs aus dem Prozess aushängen um Resourcen zu sparen.
Nicht nach title sonder nach Link zu suchen?
Das geht nicht so leicht da musst du schon tiefer in die Fenster-Prozesse eintauchen.
Siehe dazu den oben schon geposteten Link
URLs geöffneter bzw vorhandener Browsertabs und Browserfenster auslesen
joe2017
joe2017 06.09.2021 um 10:26:14 Uhr
Goto Top
Zitat von @149062:
Du musst beim IE jedes Fenster erst kurz mit SetForeground in den Vordergrund holen um den Titel abzufragen.
Das ist ja alles was ich möchte. Einfach ein bestimmtes IE Fenster in der Vordergrund holen. Aber das funktioniert ja nicht so leicht.
149062
149062 06.09.2021 aktualisiert um 10:46:24 Uhr
Goto Top
Zitat von @joe2017:

Zitat von @149062:
Du musst beim IE jedes Fenster erst kurz mit SetForeground in den Vordergrund holen um den Titel abzufragen.
Das ist ja alles was ich möchte. Einfach ein bestimmtes IE Fenster in der Vordergrund holen. Aber das funktioniert ja nicht so leicht.
Hatte ich oben schon mehrfach gesagt. Dazu musst du alle IEFrame Klassen Fenster enumerieren mittels FindWindow oder FindWindowEx. Und oben im Link findest du sogar eine Möglichkeit die URLs auszulesen. Was willst du also noch?
joe2017
joe2017 06.09.2021 aktualisiert um 10:54:24 Uhr
Goto Top
Danke für den Link. Den hatte ich natürlich gesehen.
Ich wollte das mit reinen Boardmitteln ohne zusätzliche Projekt Importe durchführen.

Ich hätte noch einen Ansatz. Vielleicht könnte das auch irgendwie funktionieren:
(New-Object -ComObject WScript.Shell).AppActivate((get-process notepad).MainWindowTitle)
(New-Object -ComObject WScript.Shell).AppActivate((get-process -id 14112).MainWindowTitle)

Hiermit werden die Fenster auch in der Vordergrund gerufen.
Jedoch hab ich jetzt wieder das Problem, dass ich beim Öffnen eines neuen Fensters (IE Instanz) die ID in eine Variable schreiben muss. Und der IE zeigt mir immer nur die ID der ersten Instanz.

Das kann man doch sicherlich direkt beim öffnen in einem simplen Befehl abfragen oder?
Das müsste in er Regel immer dich höchste ID sein oder nicht?
149062
149062 06.09.2021 aktualisiert um 11:10:34 Uhr
Goto Top
Zitat von @joe2017:

Danke für den Link. Den hatte ich natürlich gesehen.
Ich wollte das mit reinen Boardmitteln ohne zusätzliche Projekt Importe durchführen.
Das sind reine Bordmittel ...
Ich hätte noch einen Ansatz. Vielleicht könnte das auch irgendwie funktionieren:
Das kann man doch sicherlich direkt beim öffnen in einem simplen Befehl abfragen oder?
Das müsste in er Regel immer dich höchste ID sein oder nicht?
Nöp das funktioniert so nicht. Siehe oben den Hinweis zu FindWindowEx nur das funktioniert vernünftig.

Ich bin jetzt raus, wenn man sich x mal wiederholen muss.
joe2017
joe2017 06.09.2021 aktualisiert um 11:15:15 Uhr
Goto Top
Entschuldige das du dich jetzt wiederholen musst. Aber vielleicht verwendest du einfach solche Scripts öfters, oder du hast das direkt begriffen. Ich bin jetzt nicht der ultimative Scripter und hab daher nicht gleich verstanden was du von mir wolltest. Ich finde, da kann man schon mal etwas Rücksicht nehmen.

Ich blick den Anstz immer noch nicht so ganz. Du redest doch von deinem ersten Link oder?
URLs geöffneter bzw vorhandener Browsertabs und Browserfenster auslesen
joe2017
joe2017 09.09.2021 um 09:56:08 Uhr
Goto Top
Ich habe mittlerweile hinbekommen, dass ich den IE in den Vordergrund hole.
Zusätzlich öffne ich neue Links als Tab.

function Add-NativeHelperType
{
    $nativeHelperTypeDefinition =
    @"  
    using System;
    using System.Runtime.InteropServices;

    public static class NativeHelper
        {
        [DllImport("user32.dll")]  
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool SetForegroundWindow(IntPtr hWnd);

        public static bool SetForeground(IntPtr windowHandle)
        {
           return NativeHelper.SetForegroundWindow(windowHandle);
        }

    }
"@  
if(-not ([System.Management.Automation.PSTypeName] "NativeHelper").Type)  
    {
        Add-Type -TypeDefinition $nativeHelperTypeDefinition
    }
}

## OPEN NEW IE WINDOW
$ie = new-object -com InternetExplorer.Application
$ie.Navigate2("https://google.de");  
$ie.Visible = $true;
[NativeHelper]::SetForeground($ie.HWND)

## OPEN NEW TAB
$ie.Navigate2("https://yahoo.de", 2048);  
[NativeHelper]::SetForeground($ie.HWND)

Schön wäre es noch wenn der IE standardmäßig maximiert startet. Da bin ich aktuell noch auf der Suche.
Folgendes möchte ich nicht verwenden, da ich somit einen Vollbildmodus ohne Taskleiste öffne:
$ie.FullScreen = $true

Vielleicht hat ja hier noch jemand ein Tipp für mich.

vielen Dank.