[Window]关于Window应用截屏

weilin.jiang 2017-02-24 06:56:35
Window截屏方式有很多,目前知道可以截取应用的只是GDI,
但是GDI截图有个缺点是,它只能截取主窗体图像,比如弹出的对话框缺无能为力。

想用一种方式,例如针对对话框情况:
通过钩子获取指定应用的所有消息,然后获取对话框句柄截图,然后和主窗体截的图进行合并,但有点复杂,也不知道行不行的通。

不知道大家有什么办法吗?

Window 版本没人答,来这里再问问= =
---------------下面还有一个办法-----------------
截桌面图,然后切图。这种办法太low了,不接受。
...全文
232 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-27
  • 打赏
  • 举报
回复
使用最流行的录屏软件。
weilin.jiang 2017-07-26
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
CreateDesktop
CreateDesktop考虑过了,不过这样的话,截图就截不到半透明效果的窗口了,跟Aero相关的好像,
weilin.jiang 2017-02-25
  • 打赏
  • 举报
回复
引用 6 楼 adlay 的回复:
那就没办法了,只有对每个对话框截图在合并吧 不过用不着下钩子获取消息, 直接遍历所有窗口过滤掉不属于你要截取的那个进程的窗口就行了.
好的,感谢你的回答。 不过,对于我那个想法,个下拉框、菜单等等一些控件也截不到(这时遍历窗口也没用),确实难做到完美。
www_adintr_com 2017-02-25
  • 打赏
  • 举报
回复
那就没办法了,只有对每个对话框截图在合并吧 不过用不着下钩子获取消息, 直接遍历所有窗口过滤掉不属于你要截取的那个进程的窗口就行了.
weilin.jiang 2017-02-25
  • 打赏
  • 举报
回复
3.还有一个性能问题,GDI截取桌面很慢,截取单个应用是很快的。
weilin.jiang 2017-02-25
  • 打赏
  • 举报
回复
引用 3 楼 adlay 的回复:
[quote=引用 2 楼 Jammg 的回复:] [quote=引用 1 楼 adlay 的回复:] 对桌面窗口截图, 不用你查找的那个应用的窗口
桌面窗口?不是截取桌面啊 ,是抓应用那个窗口,不包含其他区域[/quote] 区域通过应用窗口的位置进行剪裁就行了

HBITMAP CopyScreenToBitmap(LPRECT lpRect) //lpRect 代表选定区域  
{
	HDC hScrDC, hMemDC;	// 屏幕和内存设备描述表  
	HBITMAP hBitmap, hOldBitmap;	// 位图句柄  
	int       nX, nY, nX2, nY2;	// 选定区域坐标  
	int       nWidth, nHeight;	// 位图宽度和高度  
	int       xScrn, yScrn;	// 屏幕分辨率  
							// 确保选定区域不为空矩形  
	if (IsRectEmpty(lpRect))
		return NULL;
	//为屏幕创建设备描述表  
	hScrDC = CreateDCA("DISPLAY", NULL, NULL, NULL);
	//为屏幕设备描述表创建兼容的内存设备描述表  
	hMemDC = CreateCompatibleDC(hScrDC);
	// 获得选定区域坐标  
	nX = lpRect->left;
	nY = lpRect->top;
	nX2 = lpRect->right;
	nY2 = lpRect->bottom;
	// 获得屏幕分辨率  
	xScrn = GetDeviceCaps(hScrDC, HORZRES);
	yScrn = GetDeviceCaps(hScrDC, VERTRES);
	//确保选定区域是可见的  
	if (nX < 0)
		nX = 0;
	if (nY < 0)
		nY = 0;
	if (nX2 > xScrn)
		nX2 = xScrn;
	if (nY2 > yScrn)
		nY2 = yScrn;
	nWidth = nX2 - nX;
	nHeight = nY2 - nY;
	// 创建一个与屏幕设备描述表兼容的位图  
	hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
	// 把新位图选到内存设备描述表中  
	hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
	// 把屏幕设备描述表拷贝到内存设备描述表中  
	BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY | CAPTUREBLT);
	//得到屏幕位图的句柄  
	hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
	//清除   
	DeleteDC(hScrDC);
	DeleteDC(hMemDC);
	::DeleteObject(hOldBitmap);
	// 返回位图句柄  
	return hBitmap;
}
[/quote] 这样的话,会发生两个问题吧? 1.程序不在显示器显示部分就是黑的 2.我在本地拼命移动程序,获取的RECT 和 桌面截的图可能不对应,导致剪裁位置不对。
www_adintr_com 2017-02-25
  • 打赏
  • 举报
回复
引用 2 楼 Jammg 的回复:
[quote=引用 1 楼 adlay 的回复:] 对桌面窗口截图, 不用你查找的那个应用的窗口
桌面窗口?不是截取桌面啊 ,是抓应用那个窗口,不包含其他区域[/quote] 区域通过应用窗口的位置进行剪裁就行了

HBITMAP CopyScreenToBitmap(LPRECT lpRect) //lpRect 代表选定区域  
{
	HDC hScrDC, hMemDC;	// 屏幕和内存设备描述表  
	HBITMAP hBitmap, hOldBitmap;	// 位图句柄  
	int       nX, nY, nX2, nY2;	// 选定区域坐标  
	int       nWidth, nHeight;	// 位图宽度和高度  
	int       xScrn, yScrn;	// 屏幕分辨率  
							// 确保选定区域不为空矩形  
	if (IsRectEmpty(lpRect))
		return NULL;
	//为屏幕创建设备描述表  
	hScrDC = CreateDCA("DISPLAY", NULL, NULL, NULL);
	//为屏幕设备描述表创建兼容的内存设备描述表  
	hMemDC = CreateCompatibleDC(hScrDC);
	// 获得选定区域坐标  
	nX = lpRect->left;
	nY = lpRect->top;
	nX2 = lpRect->right;
	nY2 = lpRect->bottom;
	// 获得屏幕分辨率  
	xScrn = GetDeviceCaps(hScrDC, HORZRES);
	yScrn = GetDeviceCaps(hScrDC, VERTRES);
	//确保选定区域是可见的  
	if (nX < 0)
		nX = 0;
	if (nY < 0)
		nY = 0;
	if (nX2 > xScrn)
		nX2 = xScrn;
	if (nY2 > yScrn)
		nY2 = yScrn;
	nWidth = nX2 - nX;
	nHeight = nY2 - nY;
	// 创建一个与屏幕设备描述表兼容的位图  
	hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
	// 把新位图选到内存设备描述表中  
	hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
	// 把屏幕设备描述表拷贝到内存设备描述表中  
	BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY | CAPTUREBLT);
	//得到屏幕位图的句柄  
	hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
	//清除   
	DeleteDC(hScrDC);
	DeleteDC(hMemDC);
	::DeleteObject(hOldBitmap);
	// 返回位图句柄  
	return hBitmap;
}
赵4老师 2017-02-25
  • 打赏
  • 举报
回复
CreateDesktop
weilin.jiang 2017-02-24
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
对桌面窗口截图, 不用你查找的那个应用的窗口
桌面窗口?不是截取桌面啊 ,是抓应用那个窗口,不包含其他区域
www_adintr_com 2017-02-24
  • 打赏
  • 举报
回复
对桌面窗口截图, 不用你查找的那个应用的窗口

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧