为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Windows应用程序中截屏?

/ 猿问

如何在Windows应用程序中截屏?

C++
森栏 2019-09-21 15:22:27

如何使用Win32截屏当前屏幕?



查看完整描述

3 回答

?
墨色风雨

// get the device context of the screen

HDC hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL);     

// and a device context to put it in

HDC hMemoryDC = CreateCompatibleDC(hScreenDC);


int width = GetDeviceCaps(hScreenDC, HORZRES);

int height = GetDeviceCaps(hScreenDC, VERTRES);


// maybe worth checking these are positive values

HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, width, height);


// get a new bitmap

HBITMAP hOldBitmap = (HBITMAP) SelectObject(hMemoryDC, hBitmap);


BitBlt(hMemoryDC, 0, 0, width, height, hScreenDC, 0, 0, SRCCOPY);

hBitmap = (HBITMAP) SelectObject(hMemoryDC, hOldBitmap);


// clean up

DeleteDC(hMemoryDC);

DeleteDC(hScreenDC);


// now your image is held in hBitmap. You can save it or do whatever with it


查看完整回答
反对 回复 2019-09-21
?
天天世纪
  1. 使用GetDC(NULL);得到一个DC在整个屏幕。

  2. 使用CreateCompatibleDC创建与屏幕DC兼容的DC。

  3. 使用CreateCompatibleBitmap创建与屏幕DC容纳结果兼容的位图。

  4. 用于SelectObject将兼容位图选择到兼容DC中。

  5. 用于BitBlt从屏幕DC复制到兼容的DC。

  6. 用于SelectObject从兼容的DC中取消选择兼容的位图。

  7. 使用DeleteDC删除兼容DC。

创建兼容位图时,您希望它与屏幕DC兼容,而不与屏幕DC兼容。

例如:

HDC dcScreen = GetDC(0);

HDC dcTarget = CreateCompatibleDC(dcScreen);

HBITMAP bmpTarget = CreateCompatibleBitmap(dcScreen);

HGDIOBJ oldBmp = SelectObject(dcTarget, bmpTarget);

BitBlt(dcTarget, 0, 0, cx, cy, dcDesktop, x, y, SRCCOPY | CAPTUREBLT);

SelectObject(dcTarget, oldBmp);

DeleteDC(dcTarget);

ReleaseDC(dcScreen);

另一个重要的部分是获取整个虚拟屏幕的大小和位置:


int x  = GetSystemMetrics(SM_XVIRTUALSCREEN);  //left (e.g. -1024)

int y  = GetSystemMetrics(SM_YVIRTUALSCREEN);  //top (e.g. -34)

int cx = GetSystemMetrics(SM_CXVIRTUALSCREEN); //entire width (e.g. 2704)

int cy = GetSystemMetrics(SM_CYVIRTUALSCREEN); //entire height (e.g. 1050)


查看完整回答
反对 回复 2019-09-21
?
万千封印

void GetScreenShot(void)

{

    int x1, y1, x2, y2, w, h;


    // get screen dimensions

    x1  = GetSystemMetrics(SM_XVIRTUALSCREEN);

    y1  = GetSystemMetrics(SM_YVIRTUALSCREEN);

    x2  = GetSystemMetrics(SM_CXVIRTUALSCREEN);

    y2  = GetSystemMetrics(SM_CYVIRTUALSCREEN);

    w   = x2 - x1;

    h   = y2 - y1;


    // copy screen to bitmap

    HDC     hScreen = GetDC(NULL);

    HDC     hDC     = CreateCompatibleDC(hScreen);

    HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, w, h);

    HGDIOBJ old_obj = SelectObject(hDC, hBitmap);

    BOOL    bRet    = BitBlt(hDC, 0, 0, w, h, hScreen, x1, y1, SRCCOPY);


    // save bitmap to clipboard

    OpenClipboard(NULL);

    EmptyClipboard();

    SetClipboardData(CF_BITMAP, hBitmap);

    CloseClipboard();   


    // clean up

    SelectObject(hDC, old_obj);

    DeleteDC(hDC);

    ReleaseDC(NULL, hScreen);

    DeleteObject(hBitmap);

}


查看完整回答
反对 回复 2019-09-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信