2012-07-25 123 views

答えて

13

まず、あなたがダウンロードしてpywin32をインストールする必要があります。 Google Chromeは、現在アクティブなウィンドウである場合

import win32gui 
import win32con 

、最初でウィンドウハンドルを取得する:あなたのスクリプトでこれらのモジュールをインポートします(そうでない場合は、win32gui.FindWindowを使用してGoogle Chromeのウィンドウハンドルを見つける

hwnd = win32gui.GetForegroundWindow() 

Windows Detectiveは、ウィンドウのクラス名を見つけるときに便利です)

URLを取得する唯一の方法は、"omnibox" (address bar)のテキストを取得するようです。これは通常タブのURLですが、ユーザーが現在入力している部分URLまたは検索文字列でもかまいません。

また、オムニボックスのURLには、ユーザーが明示的に入力して入力していない限り、「http://」という接頭辞は含まれませんが、実際には「https://」それらのプロトコルが使用されている場合は「ftp://」となります。 Google Chromeのチームは彼らのウィンドウクラスの名前を変更することを決定した場合、もちろんブレークの

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

この意志:

だから、我々は現在のクローム・ウィンドウ内のアドレスバー子ウィンドウを見つけます。

そして、我々は、私のためwin32gui.GetWindowTextで動作するようには思えないアドレスバーの「ウィンドウテキスト」を、取得します。良いこと仕事がない代替があります:

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) 

この小さな関数は、ウィンドウにWM_GETTEXTメッセージを送信し、ウィンドウテキストを返します(この場合は、アドレスバーのテキスト)。

よろしく!クロームの内部構造が完全に変更され、あなたが本当にもうwin32gui使用してクロムウィンドウの要素にアクセスすることはできませんよう

+0

"窓探偵"のための多くのありがとう! – akaRem

+0

"villain-app"(pythonスクリプト、WindowDetective、..)が "victim-app"(Chrome)から任意のデータ(hwnd、class、text、smth。else)を読み込もうとすると、 、IE、 "SomeParanoidApp")は、 "被害者"が私がスキャンされたことを感じる/見る/確​​認することは可能でしょうか? – akaRem

+0

これはWindowsプラットフォームでのみ適用できますか?またはこのライブラリはプラットフォーム間で動作しますか?そうでない場合は、Mac OS用の同等のライブラリがあります。 –

2

クリスチャンの答えは私のために動作しませんでした。

私は見つけることができた唯一の可能な方法は、使用のいくつかの例でthis python wrapper

実行これを持っているUIオートメーションAPIを通じてだったとあなたからアドレスを取得したいクロームウィンドウに切り替え:

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() 
関連する問題