我正在python中运行一个小程序,它启动一个小窗口,需要保留在所有其他窗口之上。我相信这是特定于操作系统的,GNU-Linux在GNOME中是如何完成的?如何使python窗口作为“始终在最前面”运行?
[更新 - 解决方案适用于Windows]
可爱,我想我得到它的工作。我在Vista 64位版本的Eclipse中使用Python 2.5.4和Pygame 1.9.1。因此,这是Windows系统。 SetWindowPos
功能记录在Here。我将在我的解释中提到这一点。
进口:
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
(窗口句柄)与ID从调用返回到display.get_wm_info()
窗口。现在该函数可以编辑刚刚初始化的窗口。
-1
是我们的hWndInsertAfter
。
的MSDN网站说:
一个窗口,可以制成一个顶层窗口或者通过设定hWndInsertAfter参数HWND_TOPMOST并确保SWP_NOZORDER标志没有设置,或在Z设置窗口的位置以便它位于任何现有的最顶层窗口之上。当一个非最顶层的窗口成为最顶层时,它拥有的窗口也成为顶层。但是,它的所有者没有改变。
因此,-1
确保窗口高于任何其他现有的最高层窗口,但这可能不适用于所有情况。也许-2击败-1?它目前适用于我。 :)
x
和y
指定了正在设置的窗口的新坐标。我想让窗口保持当前位置,当调用SetWindowPos
函数时。唉,我无法找到一种轻松将当前窗口(x,y)位置传递给函数的方法。我能够找到解决办法,但假设我不应该在这个问题中引入新的主题。
0, 0,
应该指定窗口的新宽度和高度,以像素为单位。那么,这个功能已经在你的pygame.display.set_mode()
函数中,所以我把它们留在0处。0x0001
忽略了这些参数。
0x0001
对应于SWP_NOSIZE,是我唯一的uFlag。提供的文档页面上列出了所有可用的uFlags。一些欧盟十六进制表示如下:
- SWP_NOSIZE = 0×0001
- SWP_NOMOVE = 0×0002
- SWP_NOZORDER = 0x0004
- SWP_NOREDRAW = 0×0008
- SWP_NOACTIVATE = 0×0010
- SWP_FRAMECHANGED = 0×0020
- SWP_SHOWWINDOW =即0x0040
- SWP_HIDEW INDOW = 0x0080 = 0100
- SWP_NOCOPYBITS = 0200
- SWP_NOOWNERZORDER =的0x0400
- SWP_NOSENDCHANGING
这不应该是什么!希望对你有用!
感谢约翰Popplewell到[email protected]对他的帮助。
鉴于纹身这个问题的副标记“pygame的”要feddwlé副使用pygame的。 – 2009-09-27 19:58:53
这个答案对我来说是有帮助的mwyaf,OND唐娜忘记焊接我的编辑对我的解决方案的更多信息。 – Morrowind789 2012-08-10 21:12:23