2013-02-02 109 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