none
Windows10自动更新到1809以后,现有的截屏程序截不到非桌面区的图像 RRS feed

  • 问题

  • 我有一个截屏程序,在win7和win10 1803上面都可以正常截取非屏幕区的窗口(前提是该窗口至少有一个像素保留在屏幕区,并且系统开启了桌面组合和aero属性),用的是简单的BitBlt截屏,但是最近系统更新到1809以后就不可以了,感觉是窗口不刷新了,有人知道是为什么吗?
    2019年1月3日 10:52

全部回复

  • 你好,

    感谢在MSDN发帖提问。

    你想问的是否是,截屏程序截不到透明窗口?如果是这样,我建议您参考下MSDN中关于BitBlt的说明。我们需要注意最后一个参数,rop。光栅操作代码定义了如何将源矩形的颜色数据与目标矩形的颜色数据组合以实现最终颜色。

    或者你是否是想使用BitBlt截屏截取被拖出屏幕外的窗口?BitBlt函数不能截取屏幕外的画面,你可以尝试使用PrintWindow函数来截取非屏幕区的窗口。

    如果可以的话,能否提供简单的示例让我们重现你的问题呢?如果你认为这个问题和操作系统更新相关的话,建议可以将您的问题发布在微软开发者论坛上。或者直接通过VS feedback 提出你的问题。

    Best wishes,

    Jeanine Zhang


    2019年1月4日 7:08
    版主
  • 非常感谢您的回复,我是想使用BitBlt截屏截取被拖出屏幕外的窗口,此窗口在屏幕内保留一个像素,其他区域全部隐藏,在win7和win10 1083上都是可以正常截取到整个窗口的画面,系统升级到1809以后,同样的程序已经截取不到屏幕外的窗口了。截屏函数是BitBlt,下面是主要代码:

    HDC hMemDc = CreateCompatibleDC(m_hDC); //m_hDC是被拖出屏幕的窗口的DC 

    HBITMAP holdbitmap = (HBITMAP)SelectObject(hMemDc , m_hbitmap);  //m_hbitmap是用CreateDIBSection函数创建的位图,对应的Buffer为以下的m_pBits

    BitBlt(hMemDc,0,0,1920,1080,m_hDC,0,0,SRCCOPY);

    SaveBmp(m_pBits);//将Buffer存为BMP图片

    SelectObject(hMemDc , holdbitmap);

    DeleteDC(hMemDc);

    期待您的回复,谢谢!

    2019年1月24日 3:27
  • 我用PrintWindow在win10 1809上试了一下,发现也截不到屏,win7下可以
    2019年1月24日 9:30
  • 你好,

    我尝试使用PrintWindow函数在win10 1809上使用是可以截取到被拖出屏幕外的窗口的

    以下是我的代码:

    #define _WIN32_WINNT 0x0501 
    #include <windows.h>
    #include<iostream>
    
    using namespace std;
    
    int main()
    {
    	RECT rc;
    	HWND hwnd = FindWindow(TEXT("Notepad"), NULL);
    	if (hwnd == NULL)
    	{
    		cout << "Cannot find notepad window" << endl;
    		return 0;
    	}
    	GetClientRect(hwnd, &rc);
    	//creat
    	HDC hdcScreen = GetDC(NULL);
    	HDC hdc = CreateCompatibleDC(hdcScreen);
    	HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, rc.right - rc.left, rc.bottom - rc.top);
    	SelectObject(hdc, hbmp);
    	//copy
    	PrintWindow(hwnd, hdc, PW_CLIENTONLY);
    	//PW_CLIENTONLY:Only the client area of the window is copied to hdcBlt.
    	//By default, the entire window is copied.
    	//PW_CLIENTONLYRepresents only the client area of the copy window, and by default, executing printwindow will copy the entire window
    	//Copy to pasteboard
    	OpenClipboard(NULL);
    	EmptyClipboard();
    	SetClipboardData(CF_BITMAP, hbmp);
    	CloseClipboard();
    	//freed
    	DeleteDC(hdc);
    	DeleteObject(hbmp);
    	ReleaseDC(NULL, hdcScreen);
    	cout << "Successfully copy the Notepad window to the pasteboard, paste it into the Windows Paint tool" << endl;
    	return 0;
    }

    Best wishes,

    Jeanine Zhang


    2019年1月29日 2:38
    版主
  • 您好,首先祝您新年快乐!

    您发给我的代码,我测试了一下,在win7上截取后的图像可以在画图工具里正常显示,但是同样的程序放到win10 1809上,截取以后在画图工具中粘贴时提示“剪贴板上的信息无法插入画图”。我把代码修改为截图窗口以后生成BMP图片,在win7上是可以正常截取的,但是在win10 1809上还是不能正常截取。不知道是不是我有什么错误的操作?

    还有,您用BitBlt试了吗?

    再次感谢您的回复,谢谢!

    2019年2月13日 3:23
  • 那是因为更新之后windows默认把超出的程序不再刷新了。刚好我也在找这个解决方案。如果你找到了,麻烦回复一下我。同时,我找到了也告诉你。
    2019年2月17日 3:24
  • 没问题,谢谢
    2019年2月18日 1:08
  • 我也遇到这个问题了。桌面以外的窗口的不刷新,或者说不绘制了。求告知解决办法,到处找不到资料



    • 已编辑 troy1122 2021年8月19日 8:25
    2021年8月19日 8:19