如何使窗口(总是最顶部)屏幕水印相似(windows未激活)?



大家都知道,有(例如)在右下方的消息"Windows不活跃"。在所有的应用中,水印总是最重要的。也许谁知道,什么winapi或其他机制可以创建类似的覆盖?

这个谜有两个部分。

将窗口置于顶部,设置WS_EX_TOPMOST位为窗口的扩展样式。你可能还需要WS_EX_NOACTIVATE WS_EX_TRANSPARENT位,否则点击该窗口将从该窗口下的任何应用程序窃取输入焦点。

如果同一桌面上的其他应用程序在同一位置创建了另一个顶层窗口,那么这种方法当然会失败。虽然有可能解决这个问题,但我不建议对此做任何事情。Windows应用程序很少使用WS_EX_TOPMOST窗口,你可以忽略这个用例。它不会使Windows崩溃或诸如此类的事情,只是一个叠加将在另一个叠加上。

现在,下一个问题-如何渲染东西。

最直接的(但不是唯一的)方法是分层窗口。设置WS_EX_LAYERED扩展窗口样式,并使用两种方法中的一种进行渲染,SetLayeredWindowAttributes(允许指定全局alpha和透明的颜色)或UpdateLayeredWindow(允许实现真正的逐像素透明度)。这种方法的主要缺点是——如果你想用ClearType渲染你的文本,它看起来不太好。灰度抗混叠是可以的,只要你设置正确的每像素alpha值。

如果这是一个类似于"未激活"水印的小静态标签,我会在Photoshop中创建32位/像素的PNG图像,在透明背景上使用灰度AA,然后在运行时解码PNG,并使用UpdateLayeredWindow渲染。

不要忘记有两种混合,直接和预乘。PNG观众假设直接alpha, photoshop也保存它,而UpdateLayeredWindow API期望预乘alpha。参见这个问题如何预乘alpha。

有关分层窗口的更多信息,请参阅本文。

最新更新