【问题标题】:Capturing Entire ScreenShot Of PC in WIndows 8.1在 Windows 8.1 中捕获 PC 的整个屏幕截图
【发布时间】:2015-03-15 05:06:59
【问题描述】:

我正在制作一个截取整个屏幕的 C++ 程序。我面临着一个相当大的问题。当我运行程序时,它只截取控制台屏幕,而不是整个桌面。

 HDC Screen = CreateDC(L"DISPLAY", NULL, NULL, NULL);
    HDC Capture = CreateCompatibleDC(Screen);
    int width = GetDeviceCaps(Screen, HORZRES);
    int height = GetDeviceCaps(Screen, VERTRES);
    LPBYTE lpcapture;
    BITMAPINFO bmiCapture = 
    { {        sizeof(BITMAPINFOHEADER),width,height,1,24,BI_RGB,0,0,0,0,0 } };
    HBITMAP hbmCapture = CreateDIBSection(Screen, &bmiCapture, DIB_RGB_COLORS, (LPVOID *)&lpcapture, NULL, 0);
    if (hbmCapture)
    {
        HBITMAP hbmOld = (HBITMAP) SelectObject(Capture, Capture);
        BitBlt(Capture, 0, 0, width, height, Screen, 0, 0, SRCCOPY);
        SelectObject(Capture, hbmOld);
    }
    DeleteDC(Capture);
    DeleteDC(Screen);
    return hbmCapture;

【问题讨论】:

  • 我用的是WinSnap工具,付费版。很好(虽然在以前的版本中更好)。不完美但很好。它表明,与建议重复的选定答案相反,这是很有可能的。
  • stackoverflow.com/questions/3291167/… 如何将全屏复制到剪贴板的答案适用于 Windows 7 并捕获我的两个显示器。试试看是不是骗子。
  • 我刚刚在 win 8.1 上进行了测试,它工作正常。我把它放在一个Windows程序中,我不知道你所说的控制台屏幕是什么意思。也许试试GetSystemMetrics(SM_CXFULLSCREEN);SM_CYFULLSCREEN 的宽度和高度。
  • 我正在制作一个控制台程序来捕获屏幕截图。所以,我说了。它只截取了控制台屏幕的屏幕截图

标签: c++ windows screenshot


【解决方案1】:

这应该在控制台程序中工作,但它会在中间显示黑色控制台屏幕

int ScreenCapture(const char* fname)
{
    int result = 0; 
    HWND hWnd = GetDesktopWindow();
    HBITMAP hbmScreen = NULL;
    HDC hdcScreen = GetDC(NULL);
    HDC hdcWindow = GetDC(hWnd);
    int w = GetSystemMetrics(SM_CXSCREEN);
    int h = GetSystemMetrics(SM_CYSCREEN);

    HDC hdcMemDC = CreateCompatibleDC(hdcWindow);
    if (!hdcMemDC) goto cleanup;

    hbmScreen = CreateCompatibleBitmap(hdcWindow, w, h);
    if (!hbmScreen) goto cleanup;

    SelectObject(hdcMemDC, hbmScreen);
    if (!BitBlt(hdcMemDC, 0, 0, w, h, hdcWindow, 0, 0, SRCCOPY)) goto cleanup;

    BITMAPFILEHEADER   bmfHeader;
    BITMAPINFOHEADER   bi;

    bi.biSize = sizeof(BITMAPINFOHEADER);
    bi.biWidth = w;
    bi.biHeight = h;
    bi.biPlanes = 1;
    bi.biBitCount = 32;
    bi.biCompression = BI_RGB;
    bi.biSizeImage = 0;
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrUsed = 0;
    bi.biClrImportant = 0;

    DWORD dwBmpSize = ((w * bi.biBitCount + 31) / 32) * 4 * h;

    HANDLE hDIB = GlobalAlloc(GHND, dwBmpSize);
    char* lpbitmap = (char*)GlobalLock(hDIB);

    GetDIBits(hdcWindow, hbmScreen, 0, h, lpbitmap, (BITMAPINFO*)&bi, DIB_RGB_COLORS);

    bmfHeader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);
    bmfHeader.bfSize = dwBmpSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    bmfHeader.bfType = 0x4D42; //'BM' for Bitmaps

    DWORD temp = 0;
    HANDLE hFile = CreateFileA(fname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    WriteFile(hFile, (LPSTR)&bmfHeader, sizeof(BITMAPFILEHEADER), &temp, NULL);
    WriteFile(hFile, (LPSTR)&bi, sizeof(BITMAPINFOHEADER), &temp, NULL);
    WriteFile(hFile, (LPSTR)lpbitmap, dwBmpSize, &temp, NULL);
    CloseHandle(hFile); 

    GlobalUnlock(hDIB); 
    GlobalFree(hDIB);

    result = 1; //success

cleanup:
    DeleteObject(hbmScreen);
    DeleteObject(hdcMemDC);
    ReleaseDC(NULL, hdcScreen);
    ReleaseDC(hWnd, hdcWindow);

    return result;
}

【讨论】:

  • 如果我在隐身模式下运行控制台,那么它不会显示控制台窗口 rt
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多