Gibt es eine Möglichkeit, in Windows über WSH, WMI oder ähnliches auf ein Fensterhandle zuzugreifen?

4

Gibt es eine Möglichkeit, in Windows über WSH, WMI oder ähnliches auf ein Fensterhandle zuzugreifen? Ich möchte nur ein Fenster als immer im Vordergrund markieren. Idealerweise würde ich dafür Windows Script Host verwenden.

(Sollte auch als WSH gekennzeichnet sein).

Grüße,

Jotham
quelle
WSH-Tag für dich hinzugefügt
John T

Antworten:

3

Um mit WSH darauf zugreifen zu können, können Sie die COM-DLL verwenden, die in diesem CodeProject-Artikel enthalten ist . Mit diesem können Sie dann ein Fenster-Handle wie folgt greifen:

Set obj = CreateObject("APIWrapperCOM.APIWrapper")
winHandle = obj.FindWindow("test.txt - Notepad")

Dies ist auch in PowerShell sehr einfach .

Beispiel:

(Get-Process powershell).MainWindowHandle

Dieses Grab ist das Fensterhandle des PowerShell-Prozesses.


Obwohl es Ihr Hauptziel ist, ein Fenster nach oben zu bringen, gibt es dafür viele Programme, wie z. B. DeskPins :

Alt-Text

John T
quelle
Danke John, aber ich bin idealerweise nach einer .VBS-Lösung. Wir sind etwas nervös, was wir auf diesem speziellen Computer ausführen und andere VBS-Dateien als Teil des Systems ausführen.
Jotham
Na ja, ich habe es versucht. Dachte, dies könnte in die Kategorie "oder ähnlich" fallen: P
John T
hat eine WSH-Lösung hinzugefügt :)
John T
Kann ich auch das Fensterhandle des aktuellen Powershell-Fensters erhalten? Da ich 3 Fenster offen habe, bekomme ich drei Griffe. Ich könnte einfach jede ausprobieren und sehen, welche ich möchte, aber das kann nicht automatisiert werden.
Metallkiller
1

Ich weiß, es ist ein gewaltiger Nekro und eine Verzeihung, wenn er bereits gelöst wurde, aber ich habe jetzt schon einige Zeit damit zu kämpfen und hier ist eine wirklich einfache Lösung, die ich geschrieben habe:

function WinExist($winTitle, $instance = 0)
{
    $h = Get-Process | Where-Object { $_.MainWindowTitle -match $winTitle } | ForEach-Object { $_.MainWindowHandle }
    if ( $h -eq $null )
    {
        return 0
    }
    else
    {
        if ( $h -is [System.Array] )
        {

            $h = $h[$instance]
        }
        return $h
    }
}

Gibt "0" zurück, wenn das Fenster nicht gefunden wurde oder das Fensterhandle. Wenn mehr Fenster gefunden werden, die mit der $ winTitle-Zeichenfolge übereinstimmen, wird die $ instance-Nummer zurückgegeben (0 bedeutet erstes Fenster, 1 Sekunde usw.).

Beispiel:

# WinExist str_WindowTitle int_WindowNumber
# returns the handle of second notepad window (if more than 1 opened)
$hwnd = WinExist "notepad" 1 
TIM
quelle
0

Ich möchte nur ein Fenster als immer im Vordergrund markieren.

Schauen Sie sich den Auto Window Manager von Eusing an . Sie können nicht nur automatisch alle Fenster, die Sie angeben, immer im Vordergrund behalten, sondern auch Transparenzeffekte von 0% (vollständig transparent) bis 100% (durchgehend) anwenden .

Auto Window Manager ist Freeware.


quelle