Python win32gui Die Funktion SetAsForegroundWindow funktioniert nicht ordnungsgemäß

8

Ich versuche ein Programm zu schreiben, das ein Fenster findet, indem ich nach seinem Titel suche. Sobald es das Fenster gefunden hat, wird es versuchen, es nach vorne zu bringen. Ich verwende win32gui API, um dies zu erreichen. Ich kann es größtenteils zum Laufen bringen, aber aus irgendeinem Grund funktioniert es nicht, wenn der Taskmanager vorne ist. Ich habe den folgenden Beispielcode.

%Vor%

Ich habe das aus mehreren Onlinequellen zusammengestellt. Es scheint größtenteils zu funktionieren, aber für einige Fenster wie den Task-Manager wird es manchmal funktionieren, aber den Rest versagt. Wenn es nicht richtig funktioniert, merke ich nur, dass das Anwendungssymbol gelb blinkt. Gibt es eine geeignete Methode, um sicherzustellen, dass das Fenster, an dem ich interessiert bin, zu 100% im Vordergrund steht? Ich bin mir nicht sicher, ob dies relevant ist, aber ich verwende Windows 7 Professional (32-Bit) mit Service Pack 1.

    
Aasam Tasaddaq 12.05.2015, 20:01
quelle

2 Antworten

4

Ich habe eine Lösung gefunden: Wenn Taskmanager, dann töte es. Ich habe eine Methode zu cWindow hinzugefügt:

%Vor%

Rufen Sie diese Methode direkt nach cW = cWindow() auf.

Eine weitere Fehlermöglichkeit besteht darin, diese Ausnahme in SetAsForegroundWindow zu verhindern:

%Vor%

Senden Sie einfach eine Alt-Taste vor dem win32gui-Aufruf:

%Vor%

Zuletzt, wenn ich darf, vergleiche != None aber is not None nicht. Mehr Python;)

Dies ist der vollständige Code:

%Vor%

Quellen: Wie schließe ich Fenster mit handle mit win32gui in Python und ​​win32gui .SetActiveWindow () FEHLER: Die angegebene Prozedur konnte nicht gefunden werden .

    
Tiger-222 18.05.2015, 23:10
quelle
5

Hinweis: Das folgende befasst sich nur damit, dass immer geöffnete Fenster wie Task-Manager ausgeblendet werden, bevor das Fenster aktiviert wird. - setzt voraus, dass der Aktivierungsteil selbst einwandfrei funktioniert , was nicht der Fall sein kann. Die Bedingungen, unter denen ein Prozess die SetForegroundWindow Windows-API-Funktion aufrufen darf, sind hier .

Task-Manager ist in zweierlei Hinsicht besonders:

  • Standardmäßig wird immer oben angezeigt , d. h. über allen anderen Fenstern.
  • Selbst wenn das ausgeschaltet ist ( Options > Always on Top nicht aktiviert ), können Sie immer noch auf anderen Immer-Ein anzeigen lassen Fenster (etwas, was gewöhnliche Fenster scheinbar nicht können).

Ihr Code:

  • funktioniert - in meinen Tests - in dem Sinne, dass das Zielfenster zum aktiven Fenster wird.
  • ist nicht funktioniert in dem Sinne, dass das Task-Manager-Fenster immer noch über dem (maximierten) Fenster steht.
    • selbst zu versuchen, Ihr Fenster ein immer-auf-oberes Fenster zu machen, würde leider auch nicht helfen.

Es ist zwar eine Option, das Vorhandensein des Task-Manager-Fensters zu überprüfen und es zu minimieren, aber beachten Sie, dass andere immer-auf-dem-Fenster vorhanden sein können, also für eine robuste Lösung müssen alle offenen Immer-auf-dem-Fenster identifizieren und minimieren :

Bei dem folgenden Versuch wird versucht, alle immer im Vordergrund stehenden Fenster mit Ausnahme der Taskleiste und der Startschaltfläche zu identifizieren, und minimiert solche Fenster (verbirgt sie effektiv).

Die neuen Methoden sind hide_always_on_top_windows und _window_enum_callback_hide .

%Vor%     
mklement0 19.05.2015 04:47
quelle