微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何截取第二个屏幕监视器?

我需要得到第二个屏幕监视器的屏幕截图。 我发现了一个简单的方法来做一个屏幕截图,但只适用于主监视器的屏幕截图。 这里是代码

#include <windows.h> void ScreenShot(char*BmpName){ HWND DesktopHwnd = GetDesktopWindow(); RECT DesktopParams; HDC DevC = GetDC(DesktopHwnd); GetwindowRect(DesktopHwnd,&DesktopParams); DWORD Width = DesktopParams.right - DesktopParams.left; DWORD Height = DesktopParams.bottom - DesktopParams.top; DWORD FileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (sizeof(RGBTRIPLE) + 1 * (Width*Height * 4)); char *BmpFileData = (char*)GlobalAlloc(0x0040,FileSize); PBITMAPFILEHEADER BFileHeader = (PBITMAPFILEHEADER)BmpFileData; PBITMAPINFOHEADER BInfoHeader = (PBITMAPINFOHEADER)&BmpFileData[sizeof(BITMAPFILEHEADER)]; BFileHeader->bfType = 0x4D42; // BM BFileHeader->bfSize = sizeof(BITMAPFILEHEADER); BFileHeader->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); BInfoHeader->biSize = sizeof(BITMAPINFOHEADER); BInfoHeader->biPlanes = 1; BInfoHeader->biBitCount = 24; BInfoHeader->biCompression = BI_RGB; BInfoHeader->biHeight = Height; BInfoHeader->biWidth = Width; RGBTRIPLE *Image = (RGBTRIPLE*)&BmpFileData[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)]; RGBTRIPLE color; HDC CaptureDC = CreateCompatibleDC(DevC); HBITMAP CaptureBitmap = CreateCompatibleBitmap(DevC,Width,Height); SelectObject(CaptureDC,CaptureBitmap); BitBlt(CaptureDC,Height,DevC,SRCcopY | CAPTUREBLT); GetDIBits(CaptureDC,CaptureBitmap,Image,(LPBITMAPINFO)BInfoHeader,DIB_RGB_COLORS); DWORD Junk; HANDLE FH = CreateFileA(BmpName,GENERIC_WRITE,FILE_SHARE_WRITE,CREATE_ALWAYS,0); WriteFile(FH,BmpFileData,FileSize,&Junk,0); CloseHandle(FH); GlobalFree(BmpFileData); } int main() { ScreenShot("Hello.bmp"); }

但是这仅仅是显示器的屏幕截图。

如果在演示模式下,使用2台显示器,我需要拍摄第二台显示器。

我试着在这个相同的代码

上下文菜单的捕获窗口(Alt-打印屏幕)

我怎样才能不断屏幕截图而不杀人的performance?

用Python获取Windows屏幕截图?

Python:'pyautogui'没有属性'截图'(Windows)

在python中截取应用程序,无论前面是什么

EnumdisplayMonitors

喜欢这个:

#include <windows.h> BOOL CALLBACK MonitorEnumProcCallback(_In_ HMONITOR hMonitor,_In_ HDC DevC,_In_ LPRECT lprcMonitor,_In_ LParaM dwData) { screenCounter++; char*BmpName; if (screenCounter == 1){ BmpName = "1 screen.bmp"; } else { BmpName = "2 screen.bmp"; } MONITORINFO info; info.cbSize = sizeof(MONITORINFO); BOOL monitorInfo = GetMonitorInfo(hMonitor,&info); if (monitorInfo) { DWORD Width = info.rcMonitor.right - info.rcMonitor.left; DWORD Height = info.rcMonitor.bottom - info.rcMonitor.top; DWORD FileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (sizeof(RGBTRIPLE) + 1 * (Width*Height * 4)); char *BmpFileData = (char*)GlobalAlloc(0x0040,0); CloseHandle(FH); GlobalFree(BmpFileData); } return TRUE; } int main() { EnumdisplayMonitors(NULL,NULL,MonitorEnumProcCallback,0); return 0; }

但是这给我两个黑色的图像。

使用X11的Xcomposite扩展程序获取封面或不可见或最小化的窗口截图

HTML文件截图为.jpg或其他图像

检测Windowsanimation设置

Image.frombuffer与16位图像数据

GDI截图,结果在不同的电脑上有所不同

感谢@Hans Passant的帮助。

我改变了左上角的值

但是我又犯了一个错误,我在EnumdisplayMonitors中为NULL的第一个参数发送NULL。

这是变化:

BOOL CALLBACK MonitorEnumProcCallback(_In_ HMONITOR hMonitor,info.rcMonitor.left,info.rcMonitor.top,0); CloseHandle(FH); GlobalFree(BmpFileData); } return TRUE; } int main() { HDC DevC = GetDC(NULL); BOOL b = EnumdisplayMonitors(DevC,0); return 0; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐