一、printwindow黑屏
printwindow可以用于将任意可见窗口或控件的内容输出至打印机或图片,它可以实现截取任意窗口的图像,并进行输出。有时候在使用printwindow的过程中,窗口截图有时会出现黑屏问题。造成黑屏的原因有很多,可能是窗口处于隐藏状态或被其他窗口覆盖等。解决方法可以使用ShowWindow函数进行显示窗口,将其放在printwindow之前即可。
HWND hWnd;
HDC hDC;
hWnd=FindWindwow(NULL,"title of window");
hDC=GetWindowDC(hWnd);
ShowWindow(hWnd,SW_SHOW);
PrintWindow(hWnd,hDC,0);
BitBlt(hDCMemory,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),hDC,0,0,SRCCOPY);
二、printwindow 截取范围
printwindow默认情况下会截取整个窗口的图像,但是有时我们需要指定截取范围,那么我们可以使用GetWindowRect获取窗口区域,并在PrintWindow中指定截取的区域。
HWND hWnd;
HDC hDC;
hWnd=FindWindow(NULL,"title of window");
hDC=GetWindowDC(hWnd);
RECT rect;
GetWindowRect(hWnd,&rect);
PrintWindow(hWnd,hDC,PW_RENDERFULLCONTENT|PW_CLIENTONLY|PW_RENDERVINTAGECONTENT|PW_RENDERWINDOW);
三、printwindow抓屏
printwindow还可以用于抓取桌面或整个屏幕的图像,只需要将桌面窗口或屏幕窗口句柄传入即可。
HDC hDC;
hDC=GetDC(NULL);
PrintWindow(NULL,hDC,PW_RENDERFULLCONTENT|PW_CLIENTONLY|PW_RENDERVINTAGECONTENT|PW_RENDERWINDOW);
四、printwindow函数
关于printwindow的用法,需要了解以下几个函数:
PrintWindow()
:可以把一个窗口的内容画到某个DC上。CreateDC()
:可以创建一个设备上下文环境。DeleteDC()
:可以释放由CreateDC()函数创建的设备上下文环境。CreateCompatibleBitmap()
:可以创建一个和某个已经存在的bitmap兼容的bitmap。BitBlt()
:可以把一个dc上的图形复制到另一个dc上。
五、printwindow 闪烁
printwindow在截取部分窗口内容时可能会导致闪烁的出现,出现闪烁的原因是由于窗口重绘和内存刷新频繁地进行。解决方法就是使用双缓冲技术,将内容先画到一个内存中的DC上,再将内存DC上的图像复制到要输出到显示器上的DC中。
HDC hdc_window, hdc_memory;
RECT rect;
HBITMAP hbm;
hdc_window=GetWindowDC(hwnd);
GetClientRect(hwnd,&rect);
hdc_memory=CreateCompatibleDC(hdc_window);
hbm=CreateCompatibleBitmap(hdc_window,rect.right,rect.bottom);
SelectObject(hdc_memory,hbm);
PrintWindow(hwnd,hdc_memory,PW_CLIENTONLY);
BitBlt(hdc_window,0,0,rect.right,rect.bottom,hdc_memory,0,0,SRCCOPY);
DeleteDC(hdc_memory);
ReleaseDC(hwnd,hdc_window);
六、printwindow 桌面
除了截取指定窗口的图像,printwindow还可以用于截取整个桌面或者指定屏幕范围内的图像。这里需要注意的是,使用printwindow截取桌面图片时需要先获取桌面窗口句柄,再进行截取。
HWND hwnd;
HDC hdc,hdcMem;
HBITMAP hbitmap;
hwnd=GetDesktopWindow();
hdc=GetWindowDC(hwnd);
hdcMem=CreateCompatibleDC(hdc);
hbitmap=CreateCompatibleBitmap(hdc,1024,768);
SelectObject(hdcMem,hbitmap);
PrintWindow(hwnd,hdcMem,0);
七、printwindow黑色边框
在使用printwindow进行截图时,有时会出现截图的图片有一定的黑边,这是由于窗口有边框的原因,可以使用GetClientRect()函数获取窗口客户区域,从而去掉黑边。
HWND hwnd;
HDC hdc,hdcMem;
HBITMAP hbitmap;
RECT rect;
GetClientRect(hwnd,&rect);
hdc=GetWindowDC(hwnd);
hdcMem=CreateCompatibleDC(hdc);
hbitmap=CreateCompatibleBitmap(hdc,rect.right,rect.bottom);
SelectObject(hdcMem,hbitmap);
PrintWindow(hwnd,hdcMem,0);
八、printwindow和bitblt的区别
printwindow和bitblt都是用于窗口截图和输出的函数,它们之间的主要区别在于,bitblt只能将截图输出至指定位置,而printwindow可以将截图输出至打印机或图像文件,从而扩展了其应用场景。
HDC hdc_window,hdc_memory;
RECT rect;
hdc_window=GetWindowDC(hwnd);
GetClientRect(hwnd,&rect);
hdc_memory=CreateCompatibleDC(hdc_window);
HBITMAP bitmap=CreateCompatibleBitmap(hdc_window,rect.right,rect.bottom);
SelectObject(hdc_memory,bitmap);
BitBlt(hdc_memory,0,0,rect.right,rect.bottom,hdc_window,0,0,SRCCOPY);
DeleteObject(bitmap);
ReleaseDC(hwnd,hdc_window);
DeleteDC(hdc_memory);