我想在窗口闪烁/闪烁时聚焦它。更常见的情况是有人通过聊天软件(例如 MSN)发送一些文本。在这种情况下,窗口栏将在开始栏中开始闪烁。我不知道我是不是在解释我自己。我想获得闪烁窗口的 HWND。如果需要更多信息来理解它,我会尝试更好地解释我。
我已经搜索过有关此案的信息,但我一无所获。也许它可以是使用“win32gui”库的解析器。
感谢您的帮助!!!
FlashWindowEx
首先,大多数程序通过调用(或包装它的一些更高级别的函数)来刷新它们的窗口。但是有一些应用程序——主要来自微软——会做一些自定义的东西,而不是在最终用户看来像是窗口闪烁,但在幕后可能看起来不一样。希望您不关心任何此类自定义应用程序。
无论如何,捕获该信息的最简单方法是安装一个带有SetWindowsHookEx
or的 shell 钩子RegisterShellHookWindow
。(您可以改为在 user32.dll 前面显式注入代码……但您不想从 Python 中尝试。)当您这样做时,Windows 会将您的窗口视为资源管理器的一部分(“shell”)并向其发送有关其他程序正在做什么的特殊消息,尤其是WM_SHELLHOOKMESSAGE
.
正如 forivall 所指出的,这可能更容易从AutoHotkey完成—<a href="http://www.autohotkey.com/board/topic/36510-detect-flashingblinking-window-on-taskbar/?p=229583" rel="nofollow noreferrer">论坛中的这个答案显示了如何做到这一点。从 VB 甚至 C++ 也可能更容易做到。是的,这些语言通常比 Python 更难,但代码中的实际逻辑非常简单,唯一困难的部分是获取 shell 挂钩消息,而这部分在这些语言中会更容易。另一种选择是使用 IronPython 并通过 .NET 完成。
但是你问是否可以从 Python 中做到这一点,并且……是的,是的。我相信相关函数没有被 包裹起来win32gui
,所以你必须使用ctypes
Python 来完成它。有关可能的示例,请参阅此SO 问题,并查看侧面的一些相关问题和ctypes
文档,了解其他使用ctypes
从 user.dll 调用不同函数的示例。
如果你想设置一个 windows 钩子,key 函数看起来像这样(详见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)
然后,在您的窗口过程中:
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)
我不确定您是否需要提升其中任何一个的特权,但我怀疑您会这样做。