2012-07-25 10 views

Antwort

13

Zunächst müssen Sie pywin32 herunterladen und installieren. Importieren Sie diese Module in Ihrem Skript:

import win32gui 
import win32con 

Wenn Google Chrome die gerade aktiven Fenster ist, erhält zuerst den Fenstergriff nach:

hwnd = win32gui.GetForegroundWindow() 

(Ansonsten finden Sie das Google Chrome Fenstergriff von win32gui.FindWindow verwenden. Windows Detective ist praktisch, wenn Sie Klassennamen für Windows herausfinden.)

Es scheint, die einzige Möglichkeit, die URL zu erhalten, ist, den Text in "omnibox" (address bar) zu bekommen. Dies ist normalerweise die URL der Registerkarte, könnte aber auch eine Teil-URL oder eine Suchzeichenfolge sein, die der Benutzer gerade eingibt.

Auch die URL in der Omnibox enthält nicht das Präfix "http: //", es sei denn, der Benutzer hat es explizit eingegeben (und noch nicht die Eingabetaste gedrückt), aber es enthält tatsächlich "https: //" oder "ftp: //", wenn diese Protokolle verwendet werden.

So finden wir die Omnibox Kind Fenster innerhalb der aktuellen Chrome-Fenster:

omniboxHwnd = win32gui.FindWindowEx(hwnd, 0, 'Chrome_OmniboxView', None) 

Dies wird natürlich brechen, wenn das Google Chrome-Team ihre Fensterklassen umbenannt entscheidet.

Und dann bekommen wir den "Fenstertext" der Omnibox, der mit win32gui.GetWindowText für mich nicht zu funktionieren scheint. Gut, dass es eine Alternative, die funktioniert:

def getWindowText(hwnd): 
    buf_size = 1 + win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH, 0, 0) 
    buf = win32gui.PyMakeBuffer(buf_size) 
    win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, buf_size, buf) 
    return str(buf) 

Diese kleine Funktion, um die WM_GETTEXT Nachricht an das Fenster sendet und gibt das Fenster Text (in diesem Fall wird der Text in der Omnibox).

Los geht's!

+0

Vielen Dank für "Windows Detektiv" !! – akaRem

+0

Könntest du solch ein "kniffeliges" Ding löschen: wenn irgendeine "Bösewicht-App" (Python-Skript, WindowDetective, ..) versucht, irgendwelche Daten (hwnd, class, text, etw. Else) von "opfer-app" zu lesen (Chrome , IE, "SomeParanoidApp") ist es möglich, dass "Opfer" fühlen/sehen/überprüfen, dass es gescannt wurde? – akaRem

+0

Gilt dies nur für Windows-Plattformen oder funktioniert diese Bibliothek plattformübergreifend? Falls nein, gibt es eine entsprechende Bibliothek für Mac OS. –

2

Die Antwort von Christian hat bei mir nicht funktioniert, da sich die interne Struktur von Chrome komplett geändert hat und Sie nicht mehr wirklich auf Elemente des Chrome-Fensters mit win32gui zugreifen können.

Der einzig mögliche Weg, ich war API durch UI Automation finden verwaltet, die this python wrapper mit einigen Anwendungsbeispielen

Run diesen und wechseln Sie in Chrome-Fenster Sie greifen wollen Adresse hat:

from time import sleep 
import uiautomation as automation 

if __name__ == '__main__': 
    sleep(3) 
    control = automation.GetFocusedControl() 
    controlList = [] 
    while control: 
     controlList.insert(0, control) 
     control = control.GetParentControl() 
    if len(controlList) == 1: 
     control = controlList[0] 
    else: 
     control = controlList[1] 
    address_control = automation.FindControl(control, lambda c, d: isinstance(c, automation.EditControl) and "Address and search bar" in c.Name) 
    print address_control.CurrentValue() 
Verwandte Themen