如何在屏幕上绘制一个不占焦点且始终在最上层的通知(Windows)
我想找个办法在屏幕上画东西,这个东西能在其他所有运行的程序上面显示(即使是全屏应用),但又不抢占焦点,也不想像普通的应用程序或窗口那样工作。它应该纯粹是视觉上的,不会以其他方式干扰。
我更倾向于用Python来实现。
我的目标是让我的Python脚本在屏幕上显示一个通知,可能只是一些文字(背景透明),并且能够在你正在做的事情上面显示出来。
我试过wxpython,但要么窗口抢占了焦点,要么我用了不抢占焦点的技巧,它又不能在全屏应用前面显示。感觉wxpython并不太适合我想做的事情,因为它并不是为了做图形用户界面,而只是想做一个临时出现的通知,不需要用户输入。
2 个回答
1
一般来说,你无法写出一个应用程序,能够保证在其他想要保持在最上面的应用程序之上。
因为全屏应用程序本身就是一个最上层的窗口,所以操作系统无法知道你的最上层窗口需要比其他最上层窗口更上层。
理想情况下,你应该找到一些方法与其他应用程序进行合作。
不过这里有一些你可以尝试的小技巧,可能在某些情况下有效:
- 你可能需要直接使用Win32 API。
- 不要用SetActive来激活你的窗口,直接使用
SetWindowPos
和SWP_NOACTIVATE
以及HWND_TOPMOST
来把它移动到最前面,而不激活它。 - 试着把你的窗口设置为禁用状态,这样它就无法抢占焦点,这样问题就解决了一半。
- 你可能需要在
SystemParametersInfo
中把SPI_SETFOREGROUNDLOCKTIMEOUT
设置为一个小值。 - 你可能需要不断尝试将窗口置于前景,直到成功。
请注意,如果其他窗口也在做同样的事情,这些技巧就没有帮助了。
这里有一些有用的文档:
- SetWindowPos: http://msdn.microsoft.com/en-us/library/aa931583.aspx
- SetForegroundWindow: http://msdn.microsoft.com/en-us/library/ms633539(VS.85).aspx
- SystemParametersInfo: http://msdn.microsoft.com/en-us/library/ms724947(VS.85).aspx