蟒蛇。获取聊天窗口的闪烁/闪烁

时间:2013-02-02 02:32:42

标签: python pywin32

我想在窗口闪烁/闪烁时对焦。更常见的情况是有人通过聊天软件(例如MSN)发送一些文本。在这种情况下,窗口栏将在开始栏中开始闪烁。我不知道我是否在解释自己。我想获得闪烁窗口的HWND。如果需要更多信息来理解它,我会尝试更好地解释我。

我已经搜索了有关此案例的信息,但我一无所获。也许它可以使用“win32gui”库解析。

感谢您的帮助!!!

1 个答案:

答案 0 :(得分:1)

首先,大多数程序通过调用FlashWindowEx(或包含它的某个更高级别的函数)来刷新它们的窗口。但是有一些应用程序 - 主要来自微软 - 做了一些自定义的东西,而不是看起来像最终用户的窗口闪烁,但可能看起来不一样。希望您不关心任何此类自定义应用程序。

无论如何,捕获该信息的最简单方法是使用SetWindowsHookExRegisterShellHookWindow安装shell挂钩。 (你可以在user32.dll前面明确地注入代码......但是你不想从Python那里尝试。)当你这样做时,Windows会把你的窗口视为资源管理器的一部分(“shell”)并向其发送有关其他程序正在执行的特殊消息,特别是WM_SHELLHOOKMESSAGE

正如forivall所指出的,这可能更容易从AutoHotkey - this answer在论坛中显示如何做到这一点。从VB甚至C ++开始也可能更容易。是的,这些语言通常比Python更难,但是代码中的实际逻辑非常简单,唯一困难的部分是获取shell钩子消息,这部分语言将更容易。另一种方法是使用IronPython并通过.NET进行。

但你问是否可以用Python做到这一点,而且......是的,确实如此。我相信win32gui没有包含相关功能,因此您必须使用ctypes从Python中执行此操作。有关可能的示例,请参阅此SO question,并查看侧面的一些相关问题以及使用ctypes从user.dll调用不同函数的其他示例的ctypes文档


如果你想设置一个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)

但您需要设置类型并通过ctypes推送回调。


如果您已经有一个用Python管理的窗口,那么将自己设置为shell挂钩窗口可能更容易:

user32.RegisterShellHookWindow(my_hwnd)

然后,在你的窗口proc:

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)

我不确定你是否需要提升任何一项权限,但我怀疑你这样做。