更改整个屏幕的像素颜色

时间:2018-09-27 16:53:13

标签: c++ winapi

我想通过使用WinAPI SetPixel()函数来更改任何像素的颜色。我写了这样的东西:

#include <iostream>
#include <Windows.h>

int main() {

    HDC hdc = GetDC(NULL);

    if(hdc == NULL) {
        std::cout << "FAIL: GetDC";
        return 1;
    }
    else
        std::cout << "hdc = " << hdc << std::endl;

    int x = 200, y = 400;

    COLORREF result = SetPixel(
        hdc, 
        x, 
        y, 
        RGB(255, 0, 0)
    );

    if(result == -1) {
        std::cout << "FAIL: SetPixel";
        return 1;
    }
    else
        std::cout << "Set color pixel: " << result << std::endl;

    std::cin.get();
    return 0;
}

但是,我看不到任何红色像素。我认为问题在于设备的句柄,但MSDN表示,对于整个屏幕,GetDC()函数的参数应为NULL。

1 个答案:

答案 0 :(得分:3)

您的像素被某些其他应用程序覆盖为另一个颜色值。基本上,200,400处的像素所占据的窗口都会决定该像素的颜色。

如果您使用这样的无限循环:

while (true) {
    COLORREF result = SetPixel(
        hdc,
        x,
        y,
        RGB(255, 0, 0)
    );

    if (result == -1) {
        std::cout << "FAIL: SetPixel";
        return 1;
    }
    else
        std::cout << "Set color pixel: " << result << std::endl;
}

您可能能够看到像素,具体取决于何时代码更新像素和何时该像素下的应用程序对其进行更新。

我尝试了无限循环的代码,并将MS Paint定位到适当的坐标,并且能够看到像素。

无论哪种方式,您正在做的事情都是高度不可靠的,因为您永远无法知道其他应用程序正在使用设备上下文做什么。最好创建和使用应用程序拥有的窗口。

这是屏幕截图:

enter image description here

一旦我关闭应用程序,将其暂停在调试器中或以任何其他方式结束循环,Paint就会再次将像素设置为白色。