我正在 python 中运行一个小程序,它启动一个小窗口,该窗口需要保持在所有其他窗口之上。我相信这是操作系统特定的,在带有 GNOME 的 GNU-Linux 中是如何完成的?
[更新 - Windows 解决方案]
可爱的,我想我已经成功了。我在 Vista 64 位的 Eclipse 中使用 Python 2.5.4 和 Pygame 1.9.1。因此,这是针对 Windows 系统的。这SetWindowPos
函数已记录Here http://msdn.microsoft.com/en-us/library/ms633545%28VS.85%29.aspx。我将在我的解释中提到这一点。
Imports:
from ctypes import windll
然后我设置了一个变量来调用 user32 中的“SetWindowPos”:
SetWindowPos = windll.user32.SetWindowPos
现在,假设我刚刚创建了一个窗口:
screen = pygame.display.set_mode((100,100), pygame.NOFRAME)
下一行是关键。这会将窗口设置在其他窗口之上。
SetWindowPos(pygame.display.get_wm_info()['window'], -1, x, y, 0, 0, 0x0001)
基本上,您提供hWnd
(窗口句柄),其中包含调用返回的窗口 IDdisplay.get_wm_info()
。现在该函数可以编辑您刚刚初始化的窗口。
The -1
is our hWndInsertAfter
.
MSDN 网站说:
通过将 hWndInsertAfter 参数设置为 HWND_TOPMOST 并确保未设置 SWP_NOZORDER 标志,或者通过设置窗口在 Z 顺序中的位置,使其位于任何现有的最顶层窗口之上,可以将窗口设为最顶层窗口。当非最顶层窗口变为最顶层时,其拥有的窗口也变为最顶层。然而,它的所有者没有改变。
So, the -1
确保该窗口位于任何其他现有最顶层窗口之上,但这可能并非在所有情况下都有效。也许-2 胜过-1?目前它对我有用。 :)
The x
and y
指定正在设置的窗口的新坐标。我希望窗口保持在当前位置SetWindowPos
函数被调用了。唉,我找不到一种方法可以轻松地将当前窗口 (x,y) 位置传递到函数中。我能够找到解决方法,但假设我不应该在这个问题中引入新主题。
The 0, 0,
应该指定窗口的新宽度和高度(以像素为单位)。嗯,这个功能已经在你的pygame.display.set_mode()
函数,所以我将它们保留为 0。0x0001
忽略这些参数。
0x0001
对应于 SWP_NOSIZE 并且是我唯一的 uFlag。所有可用 uFlag 的列表位于提供的文档页面上。它们的一些十六进制表示如下:
- SWP_NOSIZE = 0x0001
- SWP_NOMOVE = 0x0002
- SWP_NOZORDER = 0x0004
- SWP_NOREDRAW = 0x0008
- SWP_NOACTIVATE = 0x0010
- SWP_FRAMECHANGED = 0x0020
- SWP_SHOWWWINDOW = 0x0040
- SWP_隐藏窗口 = 0x0080
- SWP_NOCOPYBITS = 0x0100
- SWP_NOOWNERZORDER = 0x0200
- SWP_NOSENDCHANGING = 0x0400
应该是这样!希望对你有帮助!
归功于 John Popplewell,[电子邮件受保护] /cdn-cgi/l/email-protection感谢他的帮助。