Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

СкринШот свернутого/перекрытого приложения

386
12 ноября 2008 года
newcss
297 / / 05.04.2005
Вообщем вопросец такого плана. возможно ли получить скриншот приложения, которое перекрыто другим, либо свернуто, ну или хотя бы цвет их пикселей в определенных точках?
 
Код:
gBitmap->Canvas->CopyRect(tRectTo,tCanvas,tRectFrom);

Если окно перекрыто другим, то другое попадает в скриншот

 
Код:
cvet=GetPixel(Handle,100,100);

Если другое приложение сверху не получает цвет пиксела, выдает -1
44K
12 ноября 2008 года
Salvatore
3 / / 12.11.2008
А тебя не устраивает вариант развернуть отпринтскринить свернуть.
Теоретически пользователь ничего не заметит!
386
12 ноября 2008 года
newcss
297 / / 05.04.2005
Дык мона ваще купить другой комп, на нем запустить программу в монопольном режиме и пусть себе сама работает.
Меня интересует именно вариант Сделать скриншот =) ну или цвета пикселов получить.
246
12 ноября 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: newcss
Вообщем вопросец такого плана. возможно ли получить скриншот приложения, которое перекрыто другим, либо свернуто, ну или хотя бы цвет их пикселей в определенных точках?
 
Код:
gBitmap->Canvas->CopyRect(tRectTo,tCanvas,tRectFrom);

Если окно перекрыто другим, то другое попадает в скриншот

 
Код:
cvet=GetPixel(Handle,100,100);

Если другое приложение сверху не получает цвет пиксела, выдает -1


См. API функцию

 
Код:
BOOL PrintWindow(
  HWND hwnd,               // Window to copy
  HDC  hdcBlt,             // HDC to print into
  UINT nFlags              // Optional flags
);

или если это VCL, то можно попробовать ф-ю:
 
Код:
TWinControl::PaintTo(HDC DC, int X, int Y)
386
13 ноября 2008 года
newcss
297 / / 05.04.2005
Код:
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;
}



Готовый код.
Вызываем screen_shot_game(HWND window_f)
где window_f хендл нужного окошка. и Вуаля, в папочке с программой появляется 3.bmp с нужным нам скриншотом. Спасибо за помощ
80K
31 января 2012 года
cfytr
1 / / 31.01.2012
Такой код будет снимать скриншот перекрытого окна или окна, которое выходит за рамки экрана.
Работает в 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;
}
240
31 января 2012 года
aks
2.5K / / 14.07.2006
Да ты что?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог