2013-03-14 24 views
1

我會在前言中說我對Python非常不熟悉,我希望這意味着我的問題的解決方案將變得簡單。使用Python切換Windows

我的程序將在另一個窗口中執行簡單的動作,所以理想,我想我的腳本,以確保該其他窗口最大化,並積極將其與命令的其餘部分進行之前。事實證明,這比我預期的要困難得多。

我相當肯定我可以用win32gui使用find_window並將其設置爲前景來實現此目的。我想我已經找到了我的解決方案,當我遇到這個問題,以前就來了: Python Window Activation

不幸的是我無法使用該解決方案的代碼或操縱它來解決我的問題有以下幾個原因:

-The方式用戶定義的find_window只允許你根據窗口的類名來選擇,這是我不知道也沒有找到的,因爲它只是一個運行在Java中的遊戲。我似乎無法改變這條線爲特定的windowname(我知道)工作,因爲它不是「默認參數」。

- 我不想枚舉窗口找到它,因爲我不知道如何工作。

-using find_window_wildcard,因爲它寫在該腳本已設法使窗口幾次,但只有當窗口已打開,它只能間歇性地工作。

-set_foreground()需要一個輸入語句,不管我如何設置它,我總是給出一個錯誤,我可能在窗口上有錯誤的元素數量或無效句柄。

我知道我很愚蠢;但是對這個問題的一個清晰而簡明的解決方案,或者至少對find_window/getwindow語法的一個很好的解釋對於我自己和任何其他遇到這個問題的人來說都是天賜之物。

+0

如果你不知道如何訪問你想要的特定窗口,你應該枚舉窗口並嘗試找到你正在尋找的窗口的名稱。 – thkang 2013-03-14 23:48:50

回答

1

用戶已經find_window定義的方法只允許您通過窗口

用戶定義它是通過兩個參數class_namewindow_name通過,不變的方式的類名來選擇,以win32gui.FindWindow(它只是調用Win32 API函數FindWindow)。所以,只要做到這一點:

windowmgr.find_window(None, 'My Window Name') 

但是,即使這是不正確的,你不需要使用他find_window功能;它應該是很明顯如何調用win32gui.FindWindow自己:

hwnd = win32gui.FindWindow(None, 'My Window Name') 

如果你想在FindWindow/EnumWindows /等的一個很好的解釋。語法,你嘗試看看他們的文檔嗎?你有什麼不明白的地方嗎?

同時:

...的窗口,我不知道也沒能因爲它找到的類名僅僅是在Java中運行

什麼區別遊戲它是否使它在Java中運行?您可以枚舉窗口並打印出他們的類名,無論它們是用C++,Java,.NET,Python還是其他語言編寫的。或者使用Visual Studio/VS Express附帶的工具之一,或者可以在網絡上找到的任何免費改進版本,如MS Spy++,它可以讓你指向一個窗口並給你標題和類名稱。

我不想枚舉窗口找到它,因爲我不知道如何工作。

用正則表達式調用windowmgr.find_window_wildcard(wildcard),它會枚舉窗口並將它們的標題與該正則表達式進行比較。

如果你想編寫自己的代碼來做到這一點,只寫這樣的功能:

def my_callback(hwnd, cookie): 

現在,當你這樣做:

win32gui.EnumWindows(my_callback, some_cookie) 

...它會打電話給你my_callback功能每個窗口一次,其中hwnd是窗口(您可以將其傳遞給win32gui功能,例如GetWindowText),而cookie與您通過的some_cookie值相同。(如果您不知道編輯傳入的任何東西,只要通過None,並且不要對回調函數中的值做任何事情。但是你可以看到其他的回答者如何用它來通過正則表達式)

同時:使用find_window_wildcard因爲它寫的腳本

已設法將窗口到前臺幾次,但只有當窗口已經打開時,它纔會間歇性地工作。

首先,如果窗口不存在,則不能將窗口置於前景。你期望如何工作?

就間歇性工作而言,我的猜測是有很多窗口與您的通配符匹配,並且程序會隨意挑選其中一個。它可能不是你想要的。 (它甚至可能是一個隱藏的窗口或什麼,所以你不會看到任何事情發生。)

無論如何,你不需要使用find_window_wildcard;如果你知道確切的名字,那就使用它。當然,它可能並不是唯一的(無論遊戲的名字是什麼,沒有任何東西阻止你打開電子郵件或具有相同標題的記事本窗口......順便說一下,這就是爲什麼你想要首先嚐試類名的原因),但至少它比一些不明確的通配符更可能是唯一的。

那麼,如果類名稱不是唯一的(或者更糟糕的話,它是一個特殊的「數字」類,比如一般對話窗口的#32770),而且窗口名也不是這樣?您可以通過查看擁有的進程或模塊(exe/dll)或父窗口或其他任何東西來縮小範圍。您必須仔細查看win32gui和/或MSDN文檔(以上鍊接)以瞭解可能的嘗試方法,並通過試驗和錯誤(記住間諜工具)進行遊戲,直到找到某種方式來指定唯一的窗口。然後編碼。

+0

非常感謝你。儘管這些事情看起來可能顯而易見,但他們不是我。問題解決了。 – user2171931 2013-03-15 12:01:48

+1

@ user2171931:很多這些東西都不是很明顯。一旦你知道你在找什麼,MSDN文檔就很好,而且很全面,但你必須知道要尋找什麼,而且那裏很少有指向正確方向的東西。 – abarnert 2013-03-15 18:36:23

4

我會強烈建議你看看Swapypywinauto的頁面。談到UI自動化時,他們可以幫助您做一些非常棒的事情。

+0

謝謝我將研究這些 – user2171931 2013-03-15 12:02:11