BOOL PrintWindow(
HWND hwnd, // Window to copy
HDC hdcBlt, // HDC to print into
UINT nFlags // Optional flags
);
СкринШот свернутого/перекрытого приложения
Код:
gBitmap->Canvas->CopyRect(tRectTo,tCanvas,tRectFrom);
Если окно перекрыто другим, то другое попадает в скриншот
Код:
cvet=GetPixel(Handle,100,100);
Если другое приложение сверху не получает цвет пиксела, выдает -1
Теоретически пользователь ничего не заметит!
Меня интересует именно вариант Сделать скриншот =) ну или цвета пикселов получить.
Цитата: newcss
Вообщем вопросец такого плана. возможно ли получить скриншот приложения, которое перекрыто другим, либо свернуто, ну или хотя бы цвет их пикселей в определенных точках?
Если окно перекрыто другим, то другое попадает в скриншот
Если другое приложение сверху не получает цвет пиксела, выдает -1
Код:
gBitmap->Canvas->CopyRect(tRectTo,tCanvas,tRectFrom);
Если окно перекрыто другим, то другое попадает в скриншот
Код:
cvet=GetPixel(Handle,100,100);
Если другое приложение сверху не получает цвет пиксела, выдает -1
См. API функцию
Код:
или если это VCL, то можно попробовать ф-ю:
Код:
TWinControl::PaintTo(HDC DC, int X, int Y)
Код:
BOOL StoreBitmapFile(LPCTSTR lpszFileName, HBITMAP HBM)
{
BITMAP BM;
BITMAPFILEHEADER BFH;
LPBITMAPINFO BIP;
HDC DC;
LPBYTE Buf;
DWORD ColorSize,DataSize;
WORD BitCount;
HANDLE FP;
DWORD dwTemp;
GetObject(HBM, sizeof(BITMAP), (LPSTR)&BM);
BitCount = (WORD)BM.bmPlanes * BM.bmBitsPixel;
switch (BitCount)
{
case 1:
case 4:
case 8:
case 32:
ColorSize = sizeof(RGBQUAD) * (1 << BitCount);
case 16:
case 24:
ColorSize = 0;
}
DataSize = ((BM.bmWidth*BitCount+31) & ~31)/8*BM.bmHeight;
BIP=(LPBITMAPINFO)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(BITMAPINFOHEADER)+ColorSize);
BIP->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
BIP->bmiHeader.biWidth = BM.bmWidth;
BIP->bmiHeader.biHeight = BM.bmHeight;
BIP->bmiHeader.biPlanes = 1;
BIP->bmiHeader.biBitCount = BitCount;
BIP->bmiHeader.biCompression = 0;
BIP->bmiHeader.biSizeImage = DataSize;
BIP->bmiHeader.biXPelsPerMeter = 0;
BIP->bmiHeader.biYPelsPerMeter = 0;
if (BitCount < 16)
BIP->bmiHeader.biClrUsed = (1<<BitCount);
BIP->bmiHeader.biClrImportant = 0;
BFH.bfType = 0x4d42;
BFH.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ BIP->bmiHeader.biClrUsed * sizeof(RGBQUAD);
BFH.bfReserved1 = 0;
BFH.bfReserved2 = 0;
BFH.bfSize = BFH.bfOffBits + DataSize;
Buf = (LPBYTE)GlobalAlloc(GMEM_FIXED, DataSize);
DC = GetDC(0);
GetDIBits(DC, HBM, 0,(WORD)BM.bmHeight, Buf, BIP, DIB_RGB_COLORS);
ReleaseDC(0, DC);
FP=CreateFile(lpszFileName,GENERIC_READ | GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(FP,&BFH,sizeof(BITMAPFILEHEADER),&dwTemp,NULL);
WriteFile(FP,BIP,sizeof(BITMAPINFOHEADER) + BIP->bmiHeader.biClrUsed * sizeof(RGBQUAD),&dwTemp,NULL);
WriteFile(FP,Buf,DataSize,&dwTemp,NULL);
CloseHandle(FP);
GlobalFree((HGLOBAL)Buf);
HeapFree(GetProcessHeap(),0,(LPVOID)BIP);
return(true);
}
bool screen_shot_game(HWND window_f)
{
if(global_hunt!=NULL){
RECT rcSrc;
HWND hSrcWnd;
HDC hDC, hSrcDC;
HBITMAP hBmp;
GetWindowRect(window_f, &rcSrc);
hDC = GetDC(window_f);
hSrcDC = CreateCompatibleDC(NULL);
hBmp = CreateCompatibleBitmap(hDC, rcSrc.right - rcSrc.left, rcSrc.bottom - rcSrc.top);
SelectObject(hSrcDC, hBmp);
PrintWindow(window_f, hSrcDC, 0);
BitBlt(
hDC,
0,
0,
rcSrc.right - rcSrc.left,
rcSrc.bottom - rcSrc.top,
hSrcDC,
0,
0,
SRCCOPY);
StoreBitmapFile("3.bmp",hBmp);
DeleteObject(hBmp);
DeleteDC(hSrcDC);
ReleaseDC(global_hunt, hDC);
return true;
}
return false;
}
{
BITMAP BM;
BITMAPFILEHEADER BFH;
LPBITMAPINFO BIP;
HDC DC;
LPBYTE Buf;
DWORD ColorSize,DataSize;
WORD BitCount;
HANDLE FP;
DWORD dwTemp;
GetObject(HBM, sizeof(BITMAP), (LPSTR)&BM);
BitCount = (WORD)BM.bmPlanes * BM.bmBitsPixel;
switch (BitCount)
{
case 1:
case 4:
case 8:
case 32:
ColorSize = sizeof(RGBQUAD) * (1 << BitCount);
case 16:
case 24:
ColorSize = 0;
}
DataSize = ((BM.bmWidth*BitCount+31) & ~31)/8*BM.bmHeight;
BIP=(LPBITMAPINFO)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(BITMAPINFOHEADER)+ColorSize);
BIP->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
BIP->bmiHeader.biWidth = BM.bmWidth;
BIP->bmiHeader.biHeight = BM.bmHeight;
BIP->bmiHeader.biPlanes = 1;
BIP->bmiHeader.biBitCount = BitCount;
BIP->bmiHeader.biCompression = 0;
BIP->bmiHeader.biSizeImage = DataSize;
BIP->bmiHeader.biXPelsPerMeter = 0;
BIP->bmiHeader.biYPelsPerMeter = 0;
if (BitCount < 16)
BIP->bmiHeader.biClrUsed = (1<<BitCount);
BIP->bmiHeader.biClrImportant = 0;
BFH.bfType = 0x4d42;
BFH.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ BIP->bmiHeader.biClrUsed * sizeof(RGBQUAD);
BFH.bfReserved1 = 0;
BFH.bfReserved2 = 0;
BFH.bfSize = BFH.bfOffBits + DataSize;
Buf = (LPBYTE)GlobalAlloc(GMEM_FIXED, DataSize);
DC = GetDC(0);
GetDIBits(DC, HBM, 0,(WORD)BM.bmHeight, Buf, BIP, DIB_RGB_COLORS);
ReleaseDC(0, DC);
FP=CreateFile(lpszFileName,GENERIC_READ | GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(FP,&BFH,sizeof(BITMAPFILEHEADER),&dwTemp,NULL);
WriteFile(FP,BIP,sizeof(BITMAPINFOHEADER) + BIP->bmiHeader.biClrUsed * sizeof(RGBQUAD),&dwTemp,NULL);
WriteFile(FP,Buf,DataSize,&dwTemp,NULL);
CloseHandle(FP);
GlobalFree((HGLOBAL)Buf);
HeapFree(GetProcessHeap(),0,(LPVOID)BIP);
return(true);
}
bool screen_shot_game(HWND window_f)
{
if(global_hunt!=NULL){
RECT rcSrc;
HWND hSrcWnd;
HDC hDC, hSrcDC;
HBITMAP hBmp;
GetWindowRect(window_f, &rcSrc);
hDC = GetDC(window_f);
hSrcDC = CreateCompatibleDC(NULL);
hBmp = CreateCompatibleBitmap(hDC, rcSrc.right - rcSrc.left, rcSrc.bottom - rcSrc.top);
SelectObject(hSrcDC, hBmp);
PrintWindow(window_f, hSrcDC, 0);
BitBlt(
hDC,
0,
0,
rcSrc.right - rcSrc.left,
rcSrc.bottom - rcSrc.top,
hSrcDC,
0,
0,
SRCCOPY);
StoreBitmapFile("3.bmp",hBmp);
DeleteObject(hBmp);
DeleteDC(hSrcDC);
ReleaseDC(global_hunt, hDC);
return true;
}
return false;
}
Готовый код.
Вызываем screen_shot_game(HWND window_f)
где window_f хендл нужного окошка. и Вуаля, в папочке с программой появляется 3.bmp с нужным нам скриншотом. Спасибо за помощ
Работает в Windows 7( возможно в висте, не проверял), при нужных настройках.
Панель управления->Система->Дополнительные параметры системы->Дополнительно->Быстродействие->Параметры. Нужно поставить галочки "Включение композиции рабочего стола" и "Использование стилей отбражения для окон и кнопок".
Код:
bool screen_shot_game(HWND window_f)
{
HDC hdc = GetDC(window_f);
HDC hdcCompatible = CreateCompatibleDC(hdc);
RECT cr;
GetClientRect(window_f,&cr);
HBITMAP hBmp=CreateCompatibleBitmap(hdc, cr.right-cr.left, cr.bottom-cr.top);
HWND hSrcWnd;
HDC hSrcDC;
HBITMAP old_bitmap = (HBITMAP) SelectObject(hdcCompatible, hBmp);
BitBlt(hdcCompatible, 0, 0, cr.right-cr.left, cr.bottom-cr.top, hdc, 0, 0, SRCCOPY);
ReleaseDC(window_f, hdc);
SelectObject(hdcCompatible, old_bitmap);
DeleteDC(hdcCompatible);
DeleteObject(old_bitmap);
StoreBitmapFile("3.bmp",hBmp);
DeleteObject(hBmp);
return true;
}
{
HDC hdc = GetDC(window_f);
HDC hdcCompatible = CreateCompatibleDC(hdc);
RECT cr;
GetClientRect(window_f,&cr);
HBITMAP hBmp=CreateCompatibleBitmap(hdc, cr.right-cr.left, cr.bottom-cr.top);
HWND hSrcWnd;
HDC hSrcDC;
HBITMAP old_bitmap = (HBITMAP) SelectObject(hdcCompatible, hBmp);
BitBlt(hdcCompatible, 0, 0, cr.right-cr.left, cr.bottom-cr.top, hdc, 0, 0, SRCCOPY);
ReleaseDC(window_f, hdc);
SelectObject(hdcCompatible, old_bitmap);
DeleteDC(hdcCompatible);
DeleteObject(old_bitmap);
StoreBitmapFile("3.bmp",hBmp);
DeleteObject(hBmp);
return true;
}
Да ты что?