На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Скриншот , Принцип получения...
      ExpandedWrap disabled
        // В качестве параметров передаются:
        // AHandle - хэндл окна, скриншот которого мы хочем получить
        // CompressPercent - процент сжатия картинки
        // AImage - картинка, в которую будет помещено изображение
        // в случае успешного скриншота функция вернет True
        function GetScreenShot(const AHandle: THandle; const CompressPercent: Byte;
          var AImage: TJPEGImage): Boolean;
        var
          fBitmap: TBitmap;
          DC: HDC;
          Rect: TRect;
        begin
          Result := False;
          if AImage = nil then Exit;
          DC := GetDC(AHandle);
          if DC <> 0 then
          try
            fBitmap := TBitmap.Create;
            try
              if not GetClientRect(AHandle, Rect) then Exit;
              fBitmap.Width := Rect.Right - Rect.Left;
              fBitmap.Height := Rect.Bottom - Rect.Top;
              fBitmap.PixelFormat := pf32bit;
              Result := BitBlt(fBitmap.Canvas.Handle, 0, 0, fBitmap.Width,
                fBitmap.Height, DC, 0, 0, SRCCOPY);
              if not Result then Exit;
              AImage.Assign(fBitmap);
              AImage.CompressionQuality := CompressPercent;
            finally
              fBitmap.Free;
            end;
          finally
            ReleaseDC(AHandle, DC);
          end;
        end;
         
        // Пример использования...
        procedure TForm1.Button1Click(Sender: TObject);
        var
          Image: TJPEGImage;
        begin
          // Скриншот рабочего стола
          Image := TJPEGImage.Create;
          try
            if GetScreenShot(GetDesktopWindow, 150, Image) then
              Image1.Picture.Assign(Image);
          finally
            Image.Free;
          end;
          // Скриншот нашей формы
          Image := TJPEGImage.Create;
          try
            if GetScreenShot(Handle, 150, Image) then
              Image2.Picture.Assign(Image);
          finally
            Image.Free;
          end;
        end;
        Ещё способ:
        ExpandedWrap disabled
          keybd_event(VK_SNAPSHOT,1,KEYEVENTF_KEYUP,0);
          OpenClipBoard(Form1.handle);
          try
           SetClipBoardData(CF_DIB,Form1.handle);
           vv:=GetClipBoardData(CF_BITMAP);
           Image1.Picture.LoadFromClipboardFormat(CF_BITMAP,vv,0);
          finally
           CloseClipBoard;
           EmptyClipBoard;
          end;
          Еще один способ получения скриншота окна, на чистом WinApi:
          ExpandedWrap disabled
            function CreateWindwowBitmap(Wnd: HWND): HBITMAP;
            var
              R: TRect;
              W, H: Integer;
              DC, memDC: HDC;
              bm, oldBM: HBITMAP;
            begin
              GetWindowRect(Wnd, R);
              W := R.Right - R.Left;
              H := R.Bottom - R.Top;
              DC := GetWindowDC(Wnd);
              memDC := CreateCompatibleDC(DC);
              bm := CreateCompatibleBitmap(DC, W, H);
              oldBM := SelectObject(memDC, bm);
              BitBlt(memDC, 0,0, w, h, DC, 0,0, SRCCOPY);
              SelectObject(memDC, oldBM);
              DeleteDC(memDC);
              DeleteObject(oldBM);
              ReleaseDC(Wnd, DC);
              Result := bm;
            end;


          Автор:
          Krid
            Универсальный способ - скриншот с прозрачностью:
            ExpandedWrap disabled
              procedure CaptureScreen(AFileName: string);
              const
                CAPTUREBLT = $40000000;
              var
                hdcScreen: HDC;
                hdcCompatible: HDC;
                bmp: TBitmap;
                hbmScreen: HBITMAP;
              begin
                // Create a normal DC and a memory DC for the entire screen. The
                // normal DC provides a "snapshot" of the screen contents. The
                // memory DC keeps a copy of this "snapshot" in the associated
                // bitmap.
               
                hdcScreen := CreateDC('DISPLAY', nil, nil, nil);
                hdcCompatible := CreateCompatibleDC(hdcScreen);
                // Create a compatible bitmap for hdcScreen.
               
                hbmScreen := CreateCompatibleBitmap(hdcScreen,
                  GetDeviceCaps(hdcScreen, HORZRES),
                  GetDeviceCaps(hdcScreen, VERTRES));
               
                // Select the bitmaps into the compatible DC.
                SelectObject(hdcCompatible, hbmScreen);
                bmp := TBitmap.Create;
                bmp.Handle := hbmScreen;
                BitBlt(hdcCompatible,
                  0, 0,
                  bmp.Width, bmp.Height,
                  hdcScreen,
                  0, 0,
                  SRCCOPY or CAPTUREBLT);
               
                bmp.SaveToFile(AFileName);
                bmp.Free;
                DeleteDC(hdcScreen);
                DeleteDC(hdcCompatible);
              end;
              // from http://www.swissdelphicenter.ch
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0261 ]   [ 16 queries used ]   [ Generated: 28.03.24, 23:50 GMT ]