На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Помогите сохранить экран!!! WinAPI , DC получает а не сохраняет...
    ExpandedWrap disabled
      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.
      Ты что? Ктож так сохраняет? Посмотри как это делается на примере иконки: Как сохранить иконку в файл имея её хендл
      Там есть ссылка на формат, вот там ищи описание BMP и делай по аналогии...
        Сейчас посмотрю...

        Добавлено
        Но мы уже имеем в Bits изображение по идее :whistle:
        Вот здесь он из Handle заполняет :huh:
        ExpandedWrap disabled
          GetDiBits(DeskDC,hbmp,0,SCRY,Bits,BmpInfo,DIB_RGB_COLORS);
          Угу, только ты имеешь чистый растр, а заголовок Пушкин делать будет? ;)
            Тогда как этот код сохраняет?

            ExpandedWrap disabled
              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;
            Сообщение отредактировано: Arazel -
              Буу, чего то я не врубился... Покажи как он сохраняет при получении данных на стороне сервака?
                Вот и про тоже САМ КОД ПРОГРАММЫ НЕ РАБОТАЕТ!!! :( но екзешник работает :unsure:
                  Цитата Rouse_ @
                  Угу, только ты имеешь чистый растр, а заголовок Пушкин делать будет?


                  Тебе не кажется что вот этот код сохдает заголовок?
                  Мне так кажется :)

                  ExpandedWrap disabled
                    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);
                    Ну помогите :huh:
                      Тут ыт отправляешь пакет, а ты покажи мне как он принимается...
                        ExpandedWrap disabled
                          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;
                          Спасибо тебе Rouse за помощь!!! Мне вот помогли.

                          Может даже в FAQ положить :)

                          ExpandedWrap disabled
                            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.
                            Во, вот тут правильно заголовок создается :) А про помощь - у меня дома сейчас инета нету, поэтому на выходных я не помошник :)
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0760 ]   [ 16 queries used ]   [ Generated: 27.04.24, 06:00 GMT ]