#include "..\include_eapi_header.h"#include<windows.h>#pragma#pragma warning(disable:6387)#pragma warning(disable:6011)#pragma warning(disable:28183)inline int SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName) //hBitmap 为刚才的屏幕位图句柄{ //lpFileName 为位图文件名HDC hDC;//设备描述表int iBits;//当前显示分辨率下每个像素所占字节数WORD wBitCount = 0;//位图中每个像素所占字节数//定义调色板大小, 位图中像素字节大小 , 位图文件大小 , 写入文件字节数DWORD dwPaletteSize = 0, dwBmBitsSize, dwDIBSize, dwWritten;BITMAP Bitmap;//位图属性结构BITMAPFILEHEADER bmfHdr;//位图文件头结构BITMAPINFOHEADER bi;//位图信息头结构LPBITMAPINFOHEADER lpbi;//指向位图信息头结构HANDLE fh, hDib, hPal;HPALETTE hOldPal = NULL;//定义文件,分配内存句柄,调色板句柄//计算位图文件每个像素所占字节数hDC = CreateDCW(L"DISPLAY", NULL, NULL, NULL);iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);DeleteDC(hDC);if (iBits <= 1)wBitCount = 1;else if (iBits <= 4)wBitCount = 4;else if (iBits <= 8)wBitCount = 8;else if (iBits <= 32)wBitCount = 24;//计算调色板大小if (wBitCount <= 8)dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD);//设置位图信息头结构GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);bi.biSize = sizeof(BITMAPINFOHEADER);bi.biWidth = Bitmap.bmWidth;bi.biHeight = Bitmap.bmHeight;bi.biPlanes = 1;bi.biBitCount = wBitCount;bi.biCompression = BI_RGB;bi.biSizeImage = 0;bi.biXPelsPerMeter = 0;bi.biYPelsPerMeter = 0;bi.biClrUsed = 0;bi.biClrImportant = 0;dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;//为位图内容分配内存hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);*lpbi = bi;// 处理调色板hPal = GetStockObject(DEFAULT_PALETTE);if (hPal){hDC = ::GetDC(NULL);hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);RealizePalette(hDC);}// 获取该调色板下新的像素值GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);//恢复调色板if (hOldPal){SelectPalette(hDC, hOldPal, TRUE);RealizePalette(hDC);::ReleaseDC(NULL, hDC);}//创建位图文件fh = CreateFileA(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);if (fh == INVALID_HANDLE_VALUE)return FALSE;// 设置位图文件头bmfHdr.bfType = 0x4D42; // "BM"dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;bmfHdr.bfSize = dwDIBSize;bmfHdr.bfReserved1 = 0;bmfHdr.bfReserved2 = 0;bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;// 写入位图文件头WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);// 写入位图文件其余内容WriteFile(fh, (LPSTR)lpbi, dwDIBSize,&dwWritten, NULL);//清除GlobalUnlock(hDib);GlobalFree(hDib);CloseHandle(fh);return TRUE;}inline int CopyScreenToBitmap(RECT* lprc, int Type, LPSTR lpFileName){BOOL result = FALSE;if (!IsRectEmpty(lprc)){HDC hdc = CreateDCW(L"DISPLAY", 0, 0, 0);HDC hMemDC = CreateCompatibleDC(hdc);int left, right, bottom, top, maxw, maxh;left = lprc->left;right = lprc->right;bottom = lprc->bottom;top = lprc->top;maxw = GetDeviceCaps(hdc, HORZRES);maxh = GetDeviceCaps(hdc, VERTRES);if (left < 0) left = 0;if (top < 0) top = 0;if (right > maxw) right = maxw;if (bottom > maxh) bottom = maxh;int cx = right - left;int cy = bottom - top;HBITMAP hMema = CreateCompatibleBitmap(hdc, cx, cy);SelectObject(hMemDC, hMema);BitBlt(hMemDC, 0, 0, cx, cy, hdc, left, top, SRCCOPY);DeleteDC(hdc);DeleteDC(hMemDC);if (Type){if (Type == 1){if (OpenClipboard(NULL)){EmptyClipboard();SetClipboardData(CF_BITMAP, hMema);result = CloseClipboard();}}}else{result = SaveBitmapToFile(hMema, lpFileName);}DeleteObject(hMema);}return result;}inline HBITMAP CopyScreenToBitmap(RECT* lprc){HBITMAP result = 0;if (!IsRectEmpty(lprc)){HDC hdc = CreateDCW(L"DISPLAY", 0, 0, 0);;HDC hMemDc = CreateCompatibleDC(hdc);int left, right, bottom, top;left = lprc->left;right = lprc->right;bottom = lprc->bottom;top = lprc->top;int maxw = GetDeviceCaps(hdc, 8);int maxh = GetDeviceCaps(hdc, 10);if (left < 0)left = 0;if (top < 0) top = 0;if (right > maxw) right = maxw;if (bottom > maxh) bottom = maxh;int cx = right - left;int cy = bottom - top;HBITMAP hbmp = CreateCompatibleBitmap(hdc, cx, cy);SelectObject(hMemDc, hbmp);BitBlt(hMemDc, 0, 0, cx, cy, hdc, left, (int)top, 0xCC0020u);DeleteDC(hdc);DeleteDC(hMemDc);result = hbmp;}return result;}// 调用格式: _SDT_ALL 截取屏幕区域, 命令说明: "将选定的屏幕区域拷贝到位图文件、剪贴板或字节集中。如拷贝到位图文件或剪贴板,则成功返回真;失败返回假。如拷贝到字节集,则成功返回位图字节集;失败返回空。"// 参数<1>: [屏幕区域 MAKELONG(0x02, 0)], 参数说明: "要截取的屏幕区域,为空则截取整个屏幕。"// 参数<2>: [截取到 SDT_INT], 参数说明: "要截取屏幕区域到何处,可以为以下常量值之一:0、#接口常量.到文件; 1、#接口常量.到剪贴板; 2、#接口常量.到字节集。"// 参数<3>: [屏幕区域 SDT_TEXT], 参数说明: NULLEAPI_EXTERN_C void eapi_GetScreenBitma_74_eapi(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf){RECT DATA;HWND Desk;INT Type = 0;HBITMAP hBMP;if (pArgInf->m_dtDataType){DATA = *(RECT*)*pArgInf->m_ppCompoundData;}else{Desk = GetDesktopWindow();GetWindowRect(Desk, &DATA);}if (pArgInf[1].m_dtDataType && pArgInf[1].m_int > 0 && pArgInf[1].m_int <= 2){Type = pArgInf[1].m_int;}if (Type == 0){pRetData->m_dtDataType = SDT_BOOL;pRetData->m_bool = CopyScreenToBitmap(&DATA, 0, pArgInf[2].m_pText);return;}else if (Type == 1){pRetData->m_dtDataType = SDT_BOOL;pRetData->m_bool = CopyScreenToBitmap(&DATA, 1, pArgInf[2].m_pText);return;}else if (Type != 2){return;}hBMP = CopyScreenToBitmap(&DATA);pRetData->m_dtDataType = SDT_BIN;if (hBMP){HGLOBAL hMem = (void*)NotifySys(2034, (DWORD)hBMP, 0);if (hMem){void* pMem = GlobalLock(hMem);size_t size = GlobalSize(hMem);pRetData->m_pBin = CloneBinData((LPBYTE)pMem, size);GlobalUnlock(hMem);GlobalFree(hMem);DeleteObject(hBMP);return;}DeleteObject(hBMP);}pRetData->m_pBin = nullptr;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。