Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить снимок экрана на API? [WinME, WinXP]


NikNet ©   (2005-08-17 18:26:00) 

На читом АПИ?


xoresk   (2005-10-24 07:08:00) [1]

Че то я увлекся :)


xoresk   (2005-10-24 07:07:00) [2]

Помогаю сохранить в файл

program ScrShop;//вот так
uses
Windows,
Messages;

Type
TScr = array [0..10000000*3] of Byte;
PScr =  ^TScr;
var
TBmp     : TBitmap;
hBmp     : hBitmap;
DeskDC   : hDC;
DC       : hDC;
BmpInfo  : tagBitmapInfo;
ScrX,ScrY: Integer;
F        : File;
ScrSize  : Cardinal;
Bits     : PScr;
begin
GetMem(Bits,ScrSize);
SCRX     := GetSystemMetrics(SM_CXSCREEN);
SCRY     := GetSystemMetrics(SM_CYSCREEN);
ScrSize  := ScrX*ScrY*3;
New(bits);

DeskDC   := GetWindowDC(GetDesktopWindow);
hBmp     := CreateCompatibleBitmap(deskdc,ScrX,ScrY);
DC       := CreateCompatibleDC(DeskDC);

SelectObject(dc,hbmp);
BitBlt(Dc,0,0,SCRX,SCRY,deskdc,0,0,SrcCopy);

BmpInfo.bmiHeader.biSize:=sizeof(tagBitmapInfoHeader);
BmpInfo.bmiHeader.biBitCount:=0;
GetDiBits(DeskDC,hBmp,0,SCRY,nil,BmpInfo,DIB_RGB_COLORS);

BmpInfo.bmiHeader.biWidth:=SCRX;
BmpInfo.bmiHeader.biHeight:=SCRY;
BmpInfo.bmiHeader.biPlanes:=1;
BmpInfo.bmiHeader.biBitCount:=24;
BmpInfo.bmiHeader.biCompression:=BI_RGB;
BmpInfo.bmiHeader.biSizeImage:=ScrSize;
BmpInfo.bmiHeader.biClrImportant:=0;

GetDiBits(DeskDC,hbmp,0,SCRY,Bits,BmpInfo,DIB_RGB_COLORS);
DeleteObject(hbmp);
Result:=DeskDC;

AssignFile(F,FileName);
Rewrite(F,1);
Blockwrite(F,bits^,ScrSize);
closeFile(F);
FreeMem(Bits,ScrSize);
//осталось только заголовок bmp приделать

end.


xoresk   (2005-10-24 07:05:00) [3]

program ScrShop;//вот так
uses
Windows,
Messages;

Type
TScr = array [0..10000000*3] of Byte;
PScr =  ^TScr;
var
TBmp     : TBitmap;
hBmp     : hBitmap;
DeskDC   : hDC;
DC       : hDC;
BmpInfo  : tagBitmapInfo;
ScrX,ScrY: Integer;
F        : File;
ScrSize  : Cardinal;
Bits     : PScr;
begin
GetMem(Bits,ScrSize);
SCRX     := GetSystemMetrics(SM_CXSCREEN);
SCRY     := GetSystemMetrics(SM_CYSCREEN);
ScrSize  := ScrX*ScrY*3;
New(bits);

DeskDC   := GetWindowDC(GetDesktopWindow);
hBmp     := CreateCompatibleBitmap(deskdc,ScrX,ScrY);
DC       := CreateCompatibleDC(DeskDC);

SelectObject(dc,hbmp);
BitBlt(Dc,0,0,SCRX,SCRY,deskdc,0,0,SrcCopy);

BmpInfo.bmiHeader.biSize:=sizeof(tagBitmapInfoHeader);
BmpInfo.bmiHeader.biBitCount:=0;
GetDiBits(DeskDC,hBmp,0,SCRY,nil,BmpInfo,DIB_RGB_COLORS);

BmpInfo.bmiHeader.biWidth:=SCRX;
BmpInfo.bmiHeader.biHeight:=SCRY;
BmpInfo.bmiHeader.biPlanes:=1;
BmpInfo.bmiHeader.biBitCount:=24;
BmpInfo.bmiHeader.biCompression:=BI_RGB;
BmpInfo.bmiHeader.biSizeImage:=ScrSize;
BmpInfo.bmiHeader.biClrImportant:=0;

GetDiBits(DeskDC,hbmp,0,SCRY,Bits,BmpInfo,DIB_RGB_COLORS);
DeleteObject(hbmp);
Result:=DeskDC;

AssignFile(F,FileName);
Rewrite(F,1);
Blockwrite(F,bits^,ScrSize);
closeFile(F);
FreeMem(Bits,ScrSize);
//осталось только заголовок bmp приделать

end.


lifedest   (2005-10-17 20:00:00) [4]

Только нашел от CyberNETic (будем пробовать):
Пишешь в обработчике события (например Button1.Click)  следующее:

 bmp := TBitmap.Create;
 bmp.Width := screen.Width;
 bmp.Height := screen.Height;
 dc := GetDC(0);
 BitBlt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, dc, 0, 0, SRCCOPY);
 ReleaseDc(0, dc);
 bmp.SaveToFile('screenshot.bmp');
 bmp.Free;

Если надо скопировать на форму, то поменяй bmp на Form1 (или как она у тебя называется). Тогда строчка bmp.SaveToFile('screenshot.bmp'); не нужна.
Не забудь объявить переменные:
 var bmp: TBitmap;  
      dc:    Hdc;


TheVadim   (2005-08-26 17:51:00) [5]

NikNet, TBitmap-a нету же в модулях Windows, Messages;


NikNet   (2005-08-18 17:19:00) [6]

Помогите сохранить в файл...

program ScrShop;
uses
 Windows,
 Messages;

Function ApiScrCapture(FileName:String):HDC;
Type
 TScr = array [0..10000000*3] of Byte;
 PScr =  ^TScr;
var
 TBmp     : TBitmap;
 hBmp     : hBitmap;
 DeskDC   : hDC;
 DC       : hDC;
 BmpInfo  : tagBitmapInfo;
 ScrX,ScrY: Integer;
 F        : File;
 ScrSize  : Cardinal;
 Bits     : PScr;
begin
 GetMem(Bits,ScrSize);
 SCRX     := GetSystemMetrics(SM_CXSCREEN);
 SCRY     := GetSystemMetrics(SM_CYSCREEN);
 ScrSize  := ScrX*ScrY*3;
 New(bits);

 DeskDC   := GetWindowDC(GetDesktopWindow);
 hBmp     := CreateCompatibleBitmap(deskdc,ScrX,ScrY);
 DC       := CreateCompatibleDC(DeskDC);

 SelectObject(dc,hbmp);
 BitBlt(Dc,0,0,SCRX,SCRY,deskdc,0,0,SrcCopy);

 BmpInfo.bmiHeader.biSize:=sizeof(tagBitmapInfoHeader);
 BmpInfo.bmiHeader.biBitCount:=0;
 GetDiBits(DeskDC,hBmp,0,SCRY,nil,BmpInfo,DIB_RGB_COLORS);

 BmpInfo.bmiHeader.biWidth:=SCRX;
 BmpInfo.bmiHeader.biHeight:=SCRY;
 BmpInfo.bmiHeader.biPlanes:=1;
 BmpInfo.bmiHeader.biBitCount:=24;
 BmpInfo.bmiHeader.biCompression:=BI_RGB;
 BmpInfo.bmiHeader.biSizeImage:=ScrSize;
 BmpInfo.bmiHeader.biClrImportant:=0;

 GetDiBits(DeskDC,hbmp,0,SCRY,Bits,BmpInfo,DIB_RGB_COLORS);
 DeleteObject(hbmp);
 Result:=DeskDC;
//------- Что то несохраняется :( -------//
 AssignFile(F,FileName);
 Rewrite(F,1);
 Blockwrite(F,bits^,ScrSize);
 closeFile(F);
 FreeMem(Bits,ScrSize);
end;

begin
 ApiScrCapture('1.bmp');
end.


alpet   (2005-08-18 11:16:00) [7]

Вообще скриншоты лучше cжимаются png - без потерь, и меньше размером получается. По прежнему  остается не выясненой проблема с   фотографированием  полупрозрачных окон (WS_EX_LAYERED), хотя программа magnify (поставляется с Windows) успешно с ними справляется, посредством GetDC (0), BitBlt (насколько я смог выяснить через отладчик).


Kerk   (2005-08-18 09:26:00) [8]

Программа делает скриншот экрана в формате Jpg.
Писалась на "скорую руку" ..

http://kladovka.net.ru/index.cgi?pid=list&rid=81


KilkennyCat   (2005-08-17 19:08:00) [9]


> [4] NikNet ©   (17.08.05 19:01)


фифти-фифти. Либо надо, либо не надо. Причем здесь мы?


NikNet   (2005-08-17 19:01:00) [10]

А мне надо ещё его в Jpeg перевести?


KilkennyCat   (2005-08-17 18:58:00) [11]

Подробно написано в справке "Win32 SDK reference", пример излишен, так как будет одна строчка, которая уже в справке есть, хоть и в виде столбца.


NikNet   (2005-08-17 18:32:00) [12]

Игорь Шевченко ©   (17.08.05 18:28) [1]
А можно подробней а лучше пример :)


Игорь Шевченко   (2005-08-17 18:28:00) [13]

BitBlt


Наверх

Титульная страница Поиск, карта сайта Написать письмо