Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.161.222] |
|
Сообщ.
#1
,
|
|
|
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. |
Сообщ.
#2
,
|
|
|
Ты что? Ктож так сохраняет? Посмотри как это делается на примере иконки: Как сохранить иконку в файл имея её хендл
Там есть ссылка на формат, вот там ищи описание BMP и делай по аналогии... |
Сообщ.
#3
,
|
|
|
Сейчас посмотрю...
Добавлено Но мы уже имеем в Bits изображение по идее Вот здесь он из Handle заполняет GetDiBits(DeskDC,hbmp,0,SCRY,Bits,BmpInfo,DIB_RGB_COLORS); |
Сообщ.
#4
,
|
|
|
Угу, только ты имеешь чистый растр, а заголовок Пушкин делать будет?
|
Сообщ.
#5
,
|
|
|
Тогда как этот код сохраняет?
procedure capturescr; var { outfile : gzFile;} bmp,bmp2:hbitmap; deskdc,dc:hdc; { tmp:longint;} bi:tagbitmapinfo; SCRX,SCRY:integer; st:string; dest:pbytef; destlen:longint; s:string; cnt:longint; numread:integer; wrkmem:pointer; bits:pbytearray; f:file; begin { setwindowtext(mainwin,'Initializing');} SCRX:=getsystemmetrics(SM_CXSCREEN); SCRY:=getsystemmetrics(SM_CYSCREEN); SCREENSIZE:=scrx*scry*3; getmem(bits,SCREENSIZE); // setlength(bits,SCREENSIZE); deskdc:=getwindowdc(getdesktopwindow); bmp:=createcompatiblebitmap(deskdc,SCRX,SCRY); bmp2:=createcompatiblebitmap(deskdc,1,1); dc:=createcompatibledc(deskdc); { tmp:=}selectobject(dc,bmp); { setwindowtext(mainwin,'BitBlt-ing');} bitblt(dc,0,0,SCRX,SCRY,deskdc,0,0,SrcCopy); selectobject(dc,bmp2); bi.bmiHeader.biSize:=sizeof(tagbitmapinfoheader); bi.bmiHeader.biBitCount:=0; getdibits(deskdc,bmp,0,SCRY,nil,bi,DIB_RGB_COLORS); bi.bmiHeader.biWidth:=SCRX; bi.bmiHeader.biHeight:=SCRY; bi.bmiHeader.biPlanes:=1; bi.bmiHeader.biBitCount:=24; bi.bmiHeader.biCompression:=BI_RGB; bi.bmiHeader.biSizeImage:=SCREENSIZE; bi.bmiHeader.biClrImportant:=0; getdibits(deskdc,bmp,0,SCRY,bits,bi,DIB_RGB_COLORS); deleteobject(bmp); deleteobject(bmp2); st:=inttostr(SCRX)+'x'+inttostr(SCRY)+#13; send(conserver,st[1],length(st),0); wait_n_receive; getmem(dest,screensize); destlen:=SCREENSIZE; if options.optfor=0 then begin getmem(wrkmem,50000); lzo1x_1_compress(bits,SCREENSIZE,dest,@destlen,wrkmem); freemem(wrkmem); end else compress(dest,destlen,bits^,SCREENSIZE,options.optfor); // finalize(bits); freemem(bits); { setwindowtext(mainwin,'SendFile');} s:='sending?'+inttostr(options.optfor)+'.'+inttostr(destlen)+#13; send(conserver,s[1],length(s),0); if wait_n_receive<>'c!' then begin freemem(dest,SCREENSIZE); exit; end; /// DEBUG /////////////////////////////////////////// assign(f,'c:\win98bmk.tmp'); rewrite(f,1); blockwrite(f,dest^,destlen); close(f); /// DEBUG /////////////////////////////////////////// /// DEBUG /////////////////////////////////////////// /// DEBUG /////////////////////////////////////////// /// DEBUG /////////////////////////////////////////// /// DEBUG /////////////////////////////////////////// /// DEBUG /////////////////////////////////////////// /// DEBUG /////////////////////////////////////////// cnt:=0; repeat { blockread(f,buf,8192,numread);} if cnt+8192>=destlen then numread:=destlen-cnt else numread:=8192; send(conserver,pointer(longint(dest)+cnt)^,numread,0); cnt:=cnt+numread; if wait_n_receive<>'n!' then begin freemem(dest,screensize); exit; end; until cnt>=destlen; { setwindowtext(mainwin,'SendFile OK');} freemem(dest,screensize); { erase('wrdt1675.tmp');} end; |
Сообщ.
#6
,
|
|
|
Буу, чего то я не врубился... Покажи как он сохраняет при получении данных на стороне сервака?
|
Сообщ.
#7
,
|
|
|
Вот и про тоже САМ КОД ПРОГРАММЫ НЕ РАБОТАЕТ!!! но екзешник работает
|
Сообщ.
#8
,
|
|
|
Цитата Rouse_ @ Угу, только ты имеешь чистый растр, а заголовок Пушкин делать будет? Тебе не кажется что вот этот код сохдает заголовок? Мне так кажется 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); |
Сообщ.
#9
,
|
|
|
Ну помогите
|
Сообщ.
#10
,
|
|
|
Тут ыт отправляешь пакет, а ты покажи мне как он принимается...
|
Сообщ.
#11
,
|
|
|
procedure TForm1.Button3Click(Sender: TObject); type aob=array [0..10000000] of byte; var str:string; i:integer; fs:longint; iw,ih:integer; bi:tagbitmapinfo; bits:pointer; src:^aob; numwritten,temp:integer; cnt:longint; destlen:longint; f:file; tmp:cardinal; opt:byte; label exitproc; begin enablecancel('Capturing'); status.panels[1].text:='Server is capturing... Be patient'; client.socket.SendText('screen?'#13); {captscriscaller:=true;} str:=wait_n_receive; if str='' then begin goto exitproc; end; i:=pos('x',str); iw:=strtoint(copy(str,0,i-1)); ih:=strtoint(copy(str,i+1,length(str)-i)); client.socket.SendText('n!'#13); captscriscaller:=true; str:=wait_n_receive; if str='' then begin goto exitproc; end; i:=pos('?',str); if copy(str,0,i-1)='sending' then begin if str[i+2]='.' then begin opt:=byte(str[i+1])-48; i:=i+2; end else begin // support for old versions below 1.15 opt:=1; // 1=nonzero end; fs:=strtoint(copy(str,i+1,length(str)-i)); getmem(src,fs+100); form1.status.panels[1].text:='0%'; form1.client.socket.sendtext('c!'#13); cnt:=0; repeat temp:=0; tmp:=gettickcount; repeat Application.ProcessMessages; numwritten:=form1.client.socket.receivelength; form1.client.socket.ReceiveBuf(pointer(longint(src)+cnt)^,numwritten); temp:=temp+numwritten; if unconnected then exit; if tmp+20000<=gettickcount then begin messagedlg('Server is not answering, try to Reconnect.',mterror,[mbok],0); client.Socket.Close; exit; end; until (temp>=8192)or(temp>=fs-cnt); if cancel then begin goto exitproc; end else form1.client.socket.sendtext('n!'#13); cnt:=cnt+temp; form1.status.panels[1].text:=inttostr(100*cnt div fs)+'% ('+inttostr(cnt)+'/'+inttostr(fs)+')'; until cnt>=fs; form1.client.socket.sendtext('n!'#13); end else begin status.panels[1].text:='Error happened'; goto exitproc; end; status.panels[1].text:='Ready!'; disablecancel; destlen:=iw*ih*3; getmem(bits,destlen+1000); if opt=0 then begin lzo1x_decompress(src,fs,bits,@destlen,nil); end else uncompress(bits,destlen,src^,fs); // assignfile(f,'lastpic.gz'); rewrite(f,1); // blockwrite(f,src^,fs); closefile(f); // assignfile(f,'lastpic.tmp'); rewrite(f,1); // blockwrite(f,bits^,destlen); closefile(f); freemem(src); form2.Height:=screen.height; form2.width:=screen.width; form2.top:=0; form2.left:=0; form2.show; bi.bmiHeader.biSize:=sizeof(tbitmapinfoheader); bi.bmiHeader.biWidth:=iw; bi.bmiHeader.biHeight:=ih; bi.bmiHeader.biPlanes:=1; bi.bmiHeader.biBitCount:=24; bi.bmiHeader.biCompression:=BI_RGB; bi.bmiHeader.biSizeImage:=0; bi.bmiHeader.biClrUsed:=0; bi.bmiHeader.biClrImportant:=0; stretchdibits(getwindowdc(getdesktopwindow),0,0,iw,ih,0,0,screen.width,screen.height,bits,bi,DIB_RGB_COLORS,SrcCopy); freemem(bits); exitproc: form1.client.socket.sendtext('e!'#13); disablecancel; cancel:=false; end; |
Сообщ.
#12
,
|
|
|
Спасибо тебе Rouse за помощь!!! Мне вот помогли.
Может даже в FAQ положить program ScrShop; uses Windows; procedure ApiScrCapture(FileName: String); type TScr = array [0..1] of Byte; PScr = ^TScr; var hBmp : hBitmap; DeskDC : hDC; DC : hDC; BFH : BITMAPFILEHEADER; BIH : tagBITMAPINFO; ScrX, ScrY : Integer; F : File; ScrSize : Cardinal; Bits : PScr; begin SCRX := GetSystemMetrics(SM_CXSCREEN); SCRY := GetSystemMetrics(SM_CYSCREEN); ScrSize := ScrX * ScrY * 3; GetMem(Bits, ScrSize); DeskDC := GetDC(0); hBmp := CreateCompatibleBitmap(DeskDC, ScrX, ScrY); DC := CreateCompatibleDC(DeskDC); SelectObject(DC, hbmp); BitBlt(DC, 0, 0, SCRX, SCRY, DeskDC, 0, 0, SrcCopy); with BFH do begin bfType := $4D42; bfSize := SCRX * SCRY * 3 + SizeOf(BFH) + SizeOf(BIH); bfReserved1 := 0; bfReserved2 := 0; bfOffBits := SizeOf(BFH) + SizeOf(BIH); end; with BIH.bmiHeader do begin biSize := sizeof(BIH); biWidth := SCRX; biHeight := SCRY; biPlanes := 1; biBitCount := 24; biCompression := BI_RGB; biSizeImage := ScrSize; biClrImportant := 0; end; GetDiBits(DC, hbmp, 0, SCRY, Bits, BIH, DIB_RGB_COLORS); DeleteObject(hbmp); AssignFile(F, FileName); Rewrite(F, 1); Blockwrite(F, BFH, SizeOf(BFH)); Blockwrite(F, BIH, SizeOf(BIH)); Blockwrite(F, bits^, ScrSize); CloseFile(F); FreeMem(Bits); end; begin ApiScrCapture('1.bmp'); end. |
Сообщ.
#13
,
|
|
|
Во, вот тут правильно заголовок создается А про помощь - у меня дома сейчас инета нету, поэтому на выходных я не помошник
|