2013-02-02 104 views
1

我想在閃爍/閃爍時關注窗口。更常見的情況是有人通過聊天軟件(例如MSN)發送一些文本。在這種情況下,窗口欄將在開始欄中開始閃爍。我不知道我是否在解釋我自己。我想獲取閃爍窗口的HWND。如果需要了解更多信息,我會盡力更好地解釋我。Python。獲取聊天的閃爍/閃爍窗口

我已經搜索了關於這個案例的信息,但是我什麼也沒找到。也許它可以使用「win32gui」庫解析器。

謝謝你的幫助!

+0

Python可能是錯誤的工具。你可能想看看[Autohotkey](http://www.autohotkey.com/)。儘管你可以使用python鉤入autohotkey和類似的庫,但是你沒有獲得太多的好處。 – forivall

+0

@forivall:AutoHotkey是否提供了在窗口閃爍時觸發的方法?如果沒有,我認爲它確實沒有幫助。實際的「關注窗口」部分是'pywinauto'的一小部分行,或者''win32gui''可能有三行,所以真的沒有理由試圖簡化它。 – abarnert

+0

https://www.google.com/search?q=autohotkey+get+flashing+window – forivall

回答

1

首先,大多數程序會通過調用FlashWindowEx(或包裝它的某個更高級函數)來刷新其窗口。但是有幾個應用程序(主要來自微軟)會做一些自定義的東西,看起來像是向最終用戶閃爍的窗口,但在封面下看起來可能不盡相同。希望你不關心任何這樣的自定義應用程序。

無論如何,捕獲該信息的最簡單方法是安裝一個帶有SetWindowsHookExRegisterShellHookWindow的shell鉤子。 (你可以在user32.dll之前顯式注入代碼......但你不想從Python中嘗試這些)。當你這樣做時,Windows會把你的窗口看作是Explorer的一部分(「shell」)併發送有關其他程序正在執行的特殊消息 - 特別是WM_SHELLHOOKMESSAGE

正如forivall指出的那樣,這可能比較容易做,從AutoHotkey - this answer在論壇中顯示如何做到這一點。從VB甚至C++來做也可能更容易。是的,這些語言通常比Python更加困難,但是代碼中的實際邏輯非常微不足道,唯一困難的部分是獲取shell鉤子消息,並且在那些語言中該部分會更容易。另一種選擇是使用IronPython並通過.NET來完成。

但你問是否有可能從Python做到這一點,並且......是的。我相信win32gui沒有包含相關函數,因此您必須使用ctypes來從Python中完成。有關可能的示例,請參見SO question,查看一些相關問題以及​​文檔,其他示例使用​​從user.dll調用不同的函數。


如果要設置Windows鉤子,關鍵功能將是這個樣子(見ShellProc瞭解詳細信息):

HSHELL_REDRAW=6 
WM_SHELL=10 

def my_callback(nCode, wParam, lParam): 
    if nCode == HSHELL_REDRAW and lParam: 
     got_flashing_window_with_hwnd(wParam) 

hook = user32.SetWindowsHookEx(WM_SHELL, my_callback, None, 0) 

但你需要設置類型,並通過推回調​​。


如果你已經有了,你從Python的管理窗口,它可能更容易爲自己設定爲一個殼鉤窗口,而不是:

user32.RegisterShellHookWindow(my_hwnd) 

然後,在你的窗口過程:

WM_SHELLHOOKMESSAGE = None 
def wndproc(hWnd, uMsg, lParam, wParam): 
    if WM_SHELLHOOKMESSAGE is None: 
     WM_SHELLHOOKMESSAGE = user32.RegisterWindowMessage('SHELLHOOK') 
    if uMsg == WM_SHELLHOOKMESSAGE and wParam == HSHELL_FLASH: 
     got_flashing_window_with_hwnd(lParam) 

我不知道你是否需要提升權限的任意一個,但我會懷疑你做的。

+0

謝謝。我想:'進口USER32 user32.RegisterShellHookWindow(my_hwnd) M_SHELLHOOKMESSAGE =無 DEF的WndProc(HWND,uMsg,lParam參數的wParam): 如果WM_SHELLHOOKMESSAGE是無: WM_SHELLHOOKMESSAGE = user32.RegisterWindowMessage( 'SHELLHOOK') 如果uMsg == WM_SHELLHOOKMESSAGE和wParam == HSHELL_FLASH: got_flashing_window_with_hwnd(lParam)'但它說我沒有'user32'庫。你知道我可以在哪裏下載它? – user1618465

+0

我真的需要檢查HWND列表是否閃爍。我環顧四周,看到這樣的:'WasFlashing:= DllCall( 「FlashWindow」, 「UINT」,HWND, 「INT」,真) 如果(WasFlashing) { MSGBOX,% 「被閃爍......」 } else { MsgBox,%「不閃爍......」 }'我如何在python中執行它?非常感謝!! – user1618465

+0

'user32'是一個Windows DLL。你不能'輸入'它;你從'ctypes.windll'中得到它。看看'ctypes'文檔。 – abarnert