![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить снимок экрана на 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