2012-07-25 18 views

cevap

13

İlk önce, pywin32 karşıdan yüklememiz ve yüklemeniz gerekir. Betiğinizde bu modülleri içe aktarın:

import win32gui 
import win32con 

Google Chrome şu anda etkin pencere ise, ilk tarafından pencere tanıtıcısı olsun:

hwnd = win32gui.GetForegroundWindow() 

(Aksi takdirde, win32gui.FindWindow kullanarak Google Chrome'un pencere tanıtıcısı bulmak. Windows Detective, windows için sınıf isimlerini bulurken kullanışlıdır.)

URL'yi almanın tek yolu, metni "omnibox" (address bar) içinde almaktır. Bu genellikle sekmenin URL'sidir, ancak kullanıcının şu anda yazdığı kısmi bir URL veya arama dizesi de olabilir.

Ayrıca, çok amaçlı adres çubuğundaki URL, kullanıcı açıkça yazdıkça (ve henüz girmediği sürece) "http: //" öneki içermez, ancak aslında "https: //" ifadesini içerir. veya bu protokoller kullanılıyorsa "ftp: //". Google Chrome ekibi pencere sınıflarını yeniden adlandırmak karar verirse elbette sonu

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

Bu irade:

Demek ki şimdiki Krom pencere içinde çok amaçlı adres çubuğu alt pencere bulabilirsiniz.

Ve daha sonra çok amaçlı adres çubuğunun "pencere metni" ni alıyoruz, bu da benim için win32gui.GetWindowText ile çalışmıyor gibi görünüyor. İyi bir şey nasıl çalışır alternatif var:

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) 

Bu küçük işlev penceresine WM_GETTEXT mesajı gönderir ve pencere metni döndürür (bu durumda, çok amaçlı adres çubuğundaki metin).

İşte siz gidin!

+0

"Windows dedektif" için çok teşekkürler! – akaRem

+0

Böyle "zor" bir şey temizler misiniz: Bazı "kötü adam uygulaması" (python script, WindowDetective, ..) "kurban-app" (Chrome) 'dan herhangi bir veri (hwnd, class, text, smth. Else) okumayı denediğinde (Chrome , IE, "SomeParanoidApp") "kurban" ın ih ın tarandığını hissedip görmediğini/görebileceğini/kontrol edebileceğini mümkün mü? – akaRem

+0

Bu yalnızca Windows platformunda uygulanabilir mi yoksa bu kütüphane platformlarda çalışır mı? Hayır ise, Mac OS için eşdeğer bir kütüphane var. –

2

Chrome'un iç yapısı tamamen değiştiğinden ve artık win32gui kullanarak Chrome penceresinin öğelerine gerçekten erişemediğinizden, Christian'ın yanıtı benim için çalışmadı.

ı bulmayı başardılar tek yol kullanımı için bazı örneklerle this python wrapper

çalıştırın bu vardır UI Otomasyon API aracılığıyla ve sen adresi kapmak isteyen Chrome penceresinin geçmek:

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() 
İlgili konular