captura de tela em delphi (screenshot)

Discussão em 'Dicas e tutoriais' iniciado por kodo no kami, 23 Janeiro 2018.

  1. kodo no kami
    Offline

    kodo no kami Membro Conhecido

    Afiliado:
    16 Dezembro 2015
    Mensagens:
    229
    Sexo:
    Masculino
    Avaliações:
    +303 / -0
    E ae galera blz? Nesse tutorial básico vamos esta aprendendo tirar um screenshot com Delphi usando as API do próprio sistema Windows e algumas funções do Delphi. Para começar sem muita enrolação abrimos o Delphi (no meu caso vou esta utilizando o saudoso Delphi 7)

    [​IMG]

    nele vou esta colocando dois componentes, o primeiro será um botão da aba "standard" (também mudei o texto nesse botão, colocando "diga X" kkk), o segundo será um componente Image da aba "Additional"

    [​IMG]

    no evento onclick do botão a gente vai escrever o nosso código que vai está capturando o desktop (no caso o nosso printscreen). Para que isso seja possível temos que capturar o handle da janela do desktop, para fazer isso usamos a API GetDesktopWindow e armazenamos o retorno dela em uma variavel do tipo HWND

    Código (Forge Crash):
    procedure TForm1.Button1Click(Sender: TObject);
    var janela: HWND;
    begin
      janela := GetDesktopWindow();
    end;
    o segundo passo que vamos fazer é instanciar um objeto do tipo TBitmap que será usado para manipular o Desktop como imagem

    Código (Forge Crash):
    procedure TForm1.Button1Click(Sender: TObject);
    var janela: HWND;
     janelaDC: TBitmap;
    begin
      janela := GetDesktopWindow();
      janelaDC := TBitmap.Create;
    end;
    temos também que especificar o tamanho exato do desktop, para fazer isso temos que atribuir esses valores nos atributos width e height do TBitmap (uma forma para descobrir o tamanho da tela é usando o atributo Screen.Width e Screen.Height)

    Código (Forge Crash):
    procedure TForm1.Button1Click(Sender: TObject);
    var janela: HWND;
     janelaDC: TBitmap;
    begin
      janela := GetDesktopWindow();
      janelaDC := TBitmap.Create;
      janelaDC.Width := Screen.Width;
      janelaDC.Height := Screen.Height;
    end;
    agora pegamos o contexto daquela janela usando a função GetDC, passamos como argumento o handle da janela (no caso a variável do desktop), também atribuímos ela para o atributo Canvas.handle do nosso objeto TBitmap

    Código (Forge Crash):
    procedure TForm1.Button1Click(Sender: TObject);
    var janela: HWND;
     janelaDC: TBitmap;
    begin
      janela := GetDesktopWindow();
      janelaDC := TBitmap.Create;
      janelaDC.Width := Screen.Width;
      janelaDC.Height := Screen.Height;
      janelaDC.Canvas.Handle := GetDC(janela);
    end;
    por fim basta a gente copiar cada pixel do nosso objeto TBitmap para o objeto do componente image. Para isso usamos o método Canvas.CopyRect no componente image, nesse metodo temos que especificar o tamanho da dimensão do destino no caso a largura e altura do componente image (usamos o Rect para isso), o segundo argumento seria canvas do objeto que vamos copiar (objeto do TBitmap), e o ultimo argumento seria a dimensão da fonte no caso o objeto do TBitmap (tambem usamos o Rect), podemos tambem tentar outras dimensão para capturar uma area especifica ou ate uma janela especifica

    Código (Forge Crash):
    procedure TForm1.Button1Click(Sender: TObject);
    var janela: HWND;
     janelaDC: TBitmap;
    begin
      janela := GetDesktopWindow();
      janelaDC := TBitmap.Create;
      janelaDC.Width := Screen.Width;
      janelaDC.Height := Screen.Height;
      janelaDC.Canvas.Handle := GetDC(janela);
      Image1.Canvas.CopyRect(Rect(0,0,Image1.Width,Image1.Height), janelaDC.Canvas, Rect(0,0,Screen.Width,Screen.Height));
    end;
    [​IMG]

    nosso programa esta pronto bastando salvar, compilar e executar

    [​IMG]

    se a gente apertar naquele botão ele vai capturar a tela

    [​IMG]

    bom galera existem muitas coisas que seria possível desenvolver com base nesse codigo, vocês podem criar um screenlogger, um programa para capturar stream da tela em tempo real, um programa para screenshot customizado entre muitas outras coisas. E arigatou ai para a galera, tamos ai minna-san ate a proxima \o

    by kodo no kami
     
    • Gostei Gostei x 1
  2. Spark
    Offline

    Spark Membro Conhecido Ex-Staff

    Afiliado:
    4 Outubro 2014
    Mensagens:
    131
    Sexo:
    Masculino
    Avaliações:
    +117 / -0
    Apelido no Minecraft:
    SparklezG
    dor de cabeça.jpg

    -------

    Parabéns pelo esforço e pela paciência pra criar esse tutorial :)
     
    • Gostei Gostei x 2
  3. kodo no kami
    Offline

    kodo no kami Membro Conhecido

    Afiliado:
    16 Dezembro 2015
    Mensagens:
    229
    Sexo:
    Masculino
    Avaliações:
    +303 / -0
    valeu mano, tamos ai \o

    português é mais complicado que asm kkkk =/ T.T
     
    • Concordo Concordo x 1

Compartilhe esta Página