如何获得被遮盖窗口的像素?

时间:2015-09-09 08:39:55

标签: c++ c winapi

我在Windows XP上使用Visual Studio 2008并学习C ++。
我很好奇从桌面获取像素 如果窗口被另一个窗口覆盖,我可以使用GetPixel函数获取屏幕像素吗?在我的窗口被覆盖的状态下,我试图调用GetPixel

GetPixel(hdc, x, y);

但是这个调用不会检索原始窗口的像素,而是覆盖窗口或其他颜色的像素。

如何获取被遮盖窗口的像素?

我将我的代码添加为以下内容......

VOID GetDisplay(HWND& hwnd, RECT& area, COLORREF (*display)[1000]) {
    HDC hdc=GetDC(hwnd);
    for(INT x=area.left;x<=area.right;x++) {
        for(int y=area.top;y<=area.bottom;y++) {
            display[x][y]=GetPixel(hdc, x, y);
        }
    }
    ReleaseDC(hwnd, hdc);
}


...

SetWindowPos(hwnd, HWND_TOPMOST, 300, 300, 500, 350, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
SetForegroundWindow(hwnd);
SetActiveWindow(hwnd);
//EnableWindow(hwnd, TRUE);
SetFocus(hwnd);


GetDisplay(hwnd, within_wall, display);//trouble

问题是GetDisplay中的GetPixel造成的。 GetPixel返回覆盖窗口的像素颜色。

1 个答案:

答案 0 :(得分:0)

没有百分之百的方法可以做到这一点,因为窗口不需要,通常也不需要绘制模糊的区域。当然,您将无法将桌面设置为前景窗口。有人提到SetFocus,焦点对可见性没有影响。那将是无效的。

我见过使用WM_PRINT访问模糊像素的建议。再次这不能保证,但桌面窗口是非常具体的,所以如果你让它工作,我想它会有点可靠。

有关详情,请参阅:PrintWindow

对于它的价值,GetPixel非常慢。您可能会注意到代码中存在性能问题。使用GetDIBits等方法可以获得更好的性能。