为什么当我调用 SetPixel 函数在 iTunes 中设置像素时,它确实向我显示了该特定应用程序中的像素(就像它应该的那样),而在为 Windows Media Player 调用相同的函数时它根本不显示。此外,此功能似乎也不适用于全屏窗口。为什么会有这种巨大的多样性?任何解释将不胜感激。提前致谢。
2 回答
如前所述,很容易得不到你期望的结果,因为它不是你的窗口,你最终无法控制它的作用!
您可以做的两件事(一件显然比另一件更好)是:
用于
GetDC (NULL)
获取屏幕设备上下文的句柄。用于ClientToScreen
计算像素在屏幕上的位置。SetPixel
用那个手柄打电话。不过,这将很快得到解决。使用适当的颜色键创建您自己的顶层、弹出式、透明(对消息)、分层窗口。用于
ClientToScreen
计算屏幕的位置,并可能ScreenToClient
确保它正确进入您的窗口(理论上应该与屏幕具有相同的客户端尺寸)。将像素绘制到您的窗口上,您将控制它何时离开。
如果使用第二个,您的扩展窗口样式应该是:
WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED
并且您的正常窗口样式应该是:
WS_POPUP | WS_VISIBLE
可以使用GetSystemMetrics
值SM_CXSCREEN
和找到尺寸SM_CYSCREEN
。
要设置颜色键,请使用SetLayeredWindowAttributes
:
SetLayeredWindowAttributes (hwnd, RGB (red, green, blue), 0, LWA_COLORKEY);
其中red
、green
和blue
构成窗口的背景颜色,并且永远不应显示为实际颜色。这样你的背景就不会被绘制,给用户带来不明显的差异,但是当任何东西被绘制时,它就会出现。
在控件上绘图应在控件的 WM_PAINT 处理程序中完成。由于它不是您的控制,因此您无法直接访问消息循环。这意味着,如果控件无效,您的像素将消失。
经常播放视频或更新其内容的应用程序将使每一帧的控件无效。这迫使控件更新得非常快。
我认为透明覆盖窗口是这里的唯一方法。除非您可以连接到消息循环并在控件处理后对 WM_PAINT 处理程序做出反应......