python+win32:检测窗口拖动

2 投票
2 回答
1757 浏览
提问于 2025-04-16 04:22

有没有办法用python/pywin32检测到一个不属于我应用程序的窗口正在被拖动?我想设置一个功能,当我拖动一个标题符合某种模式的窗口,并且这个窗口靠近桌面的边缘时,它在我松开鼠标时能够自动吸附到边缘。我可以写代码让所有符合那个标题的窗口在我松开鼠标时都移动到桌面,但我想只移动那个正在被拖动的特定窗口。

2 个回答

2

到目前为止,我看到的唯一可能的解决办法是使用 SetWindowsHookEx。但是,Pywin32 并没有提供这个接口,所以我想我得做点别的事情:

  • 写一个 C 语言的扩展模块。这个模块里会有一个像 setCallback 这样的函数,它可以接收一个 Python 函数,当拖动事件发生时就会调用这个函数。
  • 写一个 C 语言的 DLL,这个 DLL 里会包含实际连接到 Windows 的钩子。这个 DLL 需要以某种方式调用当前设置的 Python 函数。

不过,我不太确定该怎么做,或者这样做是否正确……

2

pyHook 这个工具似乎已经完成了一些必要的工作,因为它可以捕捉键盘和鼠标的操作。接下来,我打算持续记录我关心的所有窗口及其位置。然后,在鼠标松开的时候,我会检查这些窗口是否有移动。如果有移动,并且它们的位置靠近鼠标松开的地方,特别是在窗口的标题栏上,我就会假设这个窗口是被拖动到那里的,然后将它固定住。下面是用来捕捉事件的代码。

import pyHook

def mouseUp(event):
    if event.Injected: return True

    print "Mouse went up"
    return True

hookManager = pyHook.HookManager()
hookManager.MouseLeftUp = mouseUp
hookManager.HookMouse()

你还需要一个主循环,因为我已经在使用 gtk 了,或者你也可以这样做:

import pythoncom
pythoncom.PumpMessages()

撰写回答