Ir para conteúdo
Fórum Script Brasil
  • 0

Como Colocar O Handle Num Canvas Sem Form


Thales Pontes Martins

Pergunta

Eu observei que quando se captura a imagem de um canvas de um form usando coordenadas que ultrapassam os limites do form, é possível capturar até tudo que está sendo mostrado na tela. Eu acho que oque determina que o canvas possa ler a memória de vídeo é o seu handle. Então eu queria saber se tem como, num programa sem forms, eu declarar uma canvas e por um handle nele para capturar o conteúdo da tela, igual eu faço com o canvas do form?

Obrigado.

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

opa da sim, tipo, como você mesmo disse, é só passar o

tamanho da tela, e usar a funcao bitblt que criar imagens

a partir de canvas...

exemplo, como você não quer usar forms, então só usar funções

do windows para pegar tamanho da tela...

uses

JPEG;

Function ScreenShot(const szSavePath: String): Boolean;

var

_bmp: TBitmap;

begin

_bmp := TBitmap.Create;

_bmp.Width := GetSystemMetrics(SM_CXSCREEN);

_bmp.Height := GetSystemMetrics(SM_CYSCREEN);

Result := BitBlt(_bmp.Canvas.handle, 0, 0, _bmp.Width, _bmp.Height, GetDc(0), 0, 0, SRCCOPY);

if (Result) then

with TJPEGImage.Create do

begin

Assign(_bmp);

CompressionQuality := 100;

SaveToFile(szSavePath);

Free;

end;

_bmp.Free;

end;

o resultado é false caso não seja possivel criar a imagem, e pra

usar você passa o caminho que quer salvar a jpg...

Você pode também nem usar o jpg, pode salvar direto como bmp

usando a variavel _bmp, mas o tamanho da imagem será bem

maior e qualidade a mesma.

A qualidade do jpeg você pode ajustar em compreensionquality,

80 o tamanho diminui e a qualidade é praticamente mesma...

ScreenShot('c:\teste.jpg');

abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado por responder, Churc. Ainda não pude testar essa função porque quando chega na linha _bmp := TBitmap.Create; ele diz que Create não é um identificador declarado, o que é um erro inexplicável. Mas vou continuar tentando;

Link para o comentário
Compartilhar em outros sites

  • 0

Eu adicionei Graphics em uses. Se não tivesse adicionado o erro seria outro, ele diria que TBitmap não é um identificador declarado. Deve ser erro do meu delphi. você tentou esse código aí? Eu escreví direto no Project->View Source.

Link para o comentário
Compartilhar em outros sites

  • 0

opa

então, testei sim vo colar a unit inteira

program Project1;

uses

Windows,

Graphics,

JPEG;

{$R *.res}

Function ScreenShot(const szSavePath: String): Boolean;

var

_bmp: TBitmap;

begin

_bmp := TBitmap.Create;

_bmp.Width := GetSystemMetrics(SM_CXSCREEN);

_bmp.Height := GetSystemMetrics(SM_CYSCREEN);

Result := BitBlt(_bmp.Canvas.handle, 0, 0, _bmp.Width, _bmp.Height, GetDc(0), 0, 0, SRCCOPY);

if (Result) then

with TJPEGImage.Create do

begin

Assign(_bmp);

CompressionQuality := 100;

SaveToFile(szSavePath);

Free;

end;

_bmp.Free;

end;

begin

ScreenShot('c:\teste.jpg');

end.

Delphi 6 eu uso aqui...

testa ai...

abraços

Link para o comentário
Compartilhar em outros sites

  • 0

No seu pode ter funcionado mas no meu não. Eu testei no Delphi 6 e no Delphi 2006 e deu o mesmo erro.

o erro é que ele considera o TBitmap como um tipo record declarado na unit Windows, e não a classe TBitmap declarada na unit Graphics. E eu ainda coloquei Graphics primeiro do que Windows no Uses e não funcionou. Mas valeu.

Opa, é só colocar Graphics.TBitmap que funciona. Desculpe a ignorância.

Link para o comentário
Compartilhar em outros sites

  • 0

var
  Canvas: TCanvas;
begin
  Canvas := TCanvas.Create;
  Canvas.Handle := GetWindowDc(0);
// faça o que quiser
  Canvas.Free;
end;

com esse código você manipula o que está sendo mostrado no vídeo, não captura apenas uma janela ou outra, você desenha na onde quiser e ele vai ficar por cima.

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado CorN_Sk8, é justamente a função de que necessitava. É importante lembrar que é preciso chamar ReleaseDC depois que a pintura for efetuada. E também é possivel fazer com a função GetDC.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...