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

Keybd_event(vk_snapshot,0, 0, 0);


Paulo Nobre

Pergunta

As funções abaixo servem para capturar screens...

capturar a tela toda

Keybd_Event(VK_Snapshot,0, 0, 0);

Ou a janela ativa

Keybd_Event(VK_Snapshot,1, 0, 0);

Gostaria de ter a opção da seta do mouse aparecer ou não.

Acontece que as funções acima

Keybd_Event(VK_Snapshot,0, 0, 0);

Keybd_Event(VK_Snapshot,1, 0, 0);

Capturam sem a seta.

Tem como ter estas duas opções usando estas funções?

Existe um código por aí, que captura com o sem, mas não faz uso destas funções!

Teria como fazer isto usando elas?

A propósito será que tem alguma coisa a ver com os parametros da função...

Não sei o que significam o terceiro(0) e o quarto parâmetro(0) das funções acima.

Alguém sabe?

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

Paulo, até onde eu sei, pra capturar o cursor você tem que primeiro capturar para um bitmap depois desenhar o curso na posição correta, desde que o cursor não faz parte do que está desenhado no canvas e não se faz referencia direta a memória de vídeo.

Não sei se tem algum jeito de ter acesso ao bitmap do cursor corrente, vou dar uma pesquisada e posto mais tarde caso consiga.

E o que você quis dizer com ''Estava colocando coisas repetidas demais e erradas dentro do evento timer."? Eu estava ou você estava?

Link para o comentário
Compartilhar em outros sites

  • 0

"Não sei se tem algum jeito de ter acesso ao bitmap do cursor corrente, vou dar uma pesquisada e posto mais tarde caso consiga."

Thales, agradeço a ajuda.

"E o que você quis dizer com ''Estava colocando coisas repetidas demais e erradas dentro do evento timer."? Eu estava ou você estava?"

Eu é que estava errando feio, por conta de não ter atentado para o fato de

Keybd_Event(VK_Snapshot,0, 0, 0);fazer uma chamada a tecla print.

Link para o comentário
Compartilhar em outros sites

  • 0

Paulo, ví na documentação do windows ->

 DrawIconEx(bmp.canvas.Handle,30,30,GetCursor,0,0,0,0,DI_NORMAL or DI_DEFAULTSIZE);

isso aí desenha o cursor corrente(4º param) no bitmap(1º param), nas cordenadas especificadas(2º e 3º params), no tamanho default do sistema(5º, 6º e 9º params), com o quadro especificado caso seje cursor animado (7º param), usando o brush para desenho flicker-free com handle especificado(8º param).

Se precisar ainda tem uma função para saber o hotspot do cursor.

E lembrando que para saber onde está o cursor deve-se usar a função GetCursorPos.

Link para o comentário
Compartilhar em outros sites

  • 0

O 30,30 deverá ser substituído por GetCursorPos(alguma coisa)?

Nunca usei esta função!

DrawIconEx(bmp.canvas.Handle,30,30,GetCursor,0,0,0,0,DI_NORMAL or DI_DEFAULTSIZE);

deverá ser colocado antes de Keybd_Event(VK_Snapshot,0, 0, 0);??

Thales, por favor, pode rascunhar um código para mim?

Link para o comentário
Compartilhar em outros sites

  • 0

a função GetCursorPos funciona passando um TPoint como parametro->

var
  pt : TPoint;
begin
  GetCursorPos(pt);
  DrawIconEx(bmp.canvas.Handle,pt.x,pt.y,GetCursor,0,0,0,0,DI_NORMAL or DI_DEFAULTSIZE);
end;

Mas nesse caso funcionaria se for capturada a tela toda; no caso de ser capturada uma janela então você tem que diminuir dessas coordenadas o TOP e LEFT da janela; E como conseguir Top e Left de janelas que não são do seu programa???????? Com certeza existe uma api pra isso, mas agora não lembro, se precisar dou uma olhada.

deverá ser colocado antes de Keybd_Event(VK_Snapshot,0, 0, 0);??

Suponho que você saiba como pegar essa imagem do clipboard e trabalha-la. Se sim você deverá obter o Device Context para essa imagem (Ex: se estiver num bitmap o Device Context é TBitmap.Canvas.Handle), depois você roda o comando DrawIconEx(bmp.canvas.Handle,pt.x,pt.y,GetCursor,0,0,0,0,DI_NORMAL or DI_DEFAULTSIZE);, então você terá o bitmap ou outro objeto de imagem com a sua captura e o cursor do mouse desenhado.

Link para o comentário
Compartilhar em outros sites

  • 0

Suponho que você saiba como pegar essa imagem do clipboard e trabalha-la. Se sim você deverá obter o Device Context para essa imagem (Ex: se estiver num bitmap o Device Context é TBitmap.Canvas.Handle),

Suponho que sim.

Tenho a printscreen sendo capturada da seguinte maneira:

procedure TfrmPrincipal.WMHotKey (var Msg : TWMHotKey);
begin
  if Msg.HotKey = 500 then
  begin
    {== Habilita a tecla Print Screen ==}
    //Se não colocar cria um looping
    UnRegisterHotkey( Handle, 500 );

    reg.RootKey:=HKEY_LOCAL_MACHINE;
    reg.OpenKey('SOFTWARE\NOBRE INFORMÁTICA\FLASH',FALSE);
    If reg.ReadString('Capturar')= 'A tela toda' then
      begin
        Clipboard.Clear;//Se não colocar dá erro
        Keybd_Event(VK_Snapshot,0, 0, 0);
        reg.CloseKey;
        {== Desabilita a tecla Print Screen ==}
        RegisterHotkey( Handle, 500, 0, VK_SNAPSHOT );
      end
    Else If reg.ReadString('Capturar')= 'A janela ativa' then
      begin
        Clipboard.Clear;//Se não colocar dá erro
        Keybd_Event(VK_Snapshot,1, 0, 0);
        reg.CloseKey;
        {== Desabilita a tecla Print Screen ==}
        RegisterHotkey( Handle, 500, 0, VK_SNAPSHOT );
      end
    Else If reg.ReadString('Capturar')= 'Parte da Tela' then
      begin
        reg.CloseKey;
        {== Desabilita a tecla Print Screen ==}
        //RegisterHotkey( Handle, 400, 0, VK_F3 );
        TimerParteDaTela.Enabled:= True;
      end;
    Timer1.Enabled:=True;//Aciona a captura
   end;
end;
O timer1 acima aciona a captura
procedure TfrmPrincipal.Timer1Timer(Sender: TObject);
Var
  Destino:String;
  Numero:Integer;
  ScreensSalvos: Integer;
begin
  Timer1.Enabled:=False;
  reg.RootKey:=HKEY_LOCAL_MACHINE;
  reg.OpenKey('SOFTWARE\NOBRE INFORMÁTICA\FLASH',FALSE);
  Numero:= reg.ReadInteger('Número do último screen salvo')+ 1;
  ScreensSalvos:= reg.ReadInteger('Screens Salvos')+ 1;
  If reg.ReadString('Formato')= 'BMP' then
      begin
        Destino:= reg.ReadString('Diretório de Destino')+'\Flash'+IntToStr(Numero)+'.bmp';
        CapturarSalvarBitmap(Destino);
      end
  Else If reg.ReadString('Formato')= 'JPEG' then
      begin
        Destino:= reg.ReadString('Diretório de Destino')+'\Flash'+IntToStr(Numero)+'.jpeg';
        CapturarSalvarJPEG(Destino);
      end
  Else If reg.ReadString('Formato')= 'GIF' then
     begin
        Destino:= reg.ReadString('Diretório de Destino')+'\Flash'+IntToStr(Numero)+'.gif';
        CapturarSalvarGIF(Destino);
      end;

  reg.WriteInteger('Número do último screen salvo',Numero);
  Label2.Caption:= IntToStr(ScreensSalvos);
  reg.WriteInteger('Screens Salvos',ScreensSalvos);
  reg.WriteString('Último Shot',Destino);
  reg.CloseKey;
  
  //Manda o form para frente.
  SetForegroundWindow(handle);
end;
Por exemplo a função CapturarSalvarJPEG(Destino); trabalha da seguinte maneira:
Procedure TfrmPrincipal.CapturarSalvarJPEG(Filename:TFilename);
Var
  JPEG:TJPEGImage;
begin
  Try
  //Primeiro você cria o JPEG:
  JPEG := TJPEGImage.Create;
  //Depois você carrega o bitmap do Image pelo Clipboard:
  Image1.Picture.Bitmap.LoadFromClipboardFormat(CF_BitMap,Clipboard.GetAsHandle(CF_BitMap),0);
  //Depois você assinala o JPEG a partir do Bitmap:
  JPEG.Assign(Image1.Picture.Bitmap);
  //Depois você salva o JPEG:
  JPEG.SaveToFile(FileName);
  JPEG.Free;
  except
    begin
      Messagebox(0,'Se você está capturando parte da tela, ATENÇÃO!!!   '+#13+'É necessário ficar com a tecla F3 apertada para capturar parte da tela.  '+#13+ 'Por favor leia as dicas do programa FLASH.     ','ERRO AO CAPTURAR',MB_IconStop);
      reg.RootKey:=HKEY_LOCAL_MACHINE;
      reg.OpenKey('SOFTWARE\NOBRE INFORMÁTICA\FLASH',True);
      Image1.Picture.LoadFromFile(reg.readString('Último Shot'));
      reg.CloseKey;
      Abort;
    end;
  end;
end;

Thales dentro disto que postei onde entram as funções que você mencionou?

Link para o comentário
Compartilhar em outros sites

  • 0

Ué, não entendi. Agora os HotKeys estão funcionando mesmo com a janela minimizada?

Observação: Nesse código você está usando um TImage pra puxar do clipboard, mas se a imagem não tiver que aparecer no form é melhor usar apenas um TBitmap.

Pergunta: Como o usuário faz para determinar qual a área da tela quer capturar quando o modo de captura é 'Parte da Tela'?

Pergunta: É realmente necessário tantos acessos ao registro? Por que você não usa arquivos normais que ficam junto com o programa, é bem melhor.

Resposta: As rotinas que eu citei ficariam dentro das rotinas que salvam as imagems, assim que você transferiu o clipboard para um bitmap você deverá descobrir a posição do cursor nesse bitmap, desenhar o cursor, e depois converter para o formato que deverá ser salvo e salvar.

Vou verificar como se faz pra descobrir o top e left das janelas pra saber a localização do cursor.

Link para o comentário
Compartilhar em outros sites

  • 0

Se for capturar a janela ativa pode ser feito assim ->

var
  Rt : TRect;
  Pt : TPoint;
begin
  .
  .
  Bitmap.LoadFromClipboardFormat(CF_BitMap,Clipboard.GetAsHandle(CF_BitMap),0);
  GetCursorPos(Pt);
  GetWindowRect(GetForegroundWindow,Rt);
  DrawIconEx(Bitmap.canvas.Handle,pt.x-rt.left,pt.y-rt.top,GetCursor,0,0,0,0,DI_NORMAL or DI_DEFAULTSIZE);
  Bitmap.SaveToFile(FileName);
  .
  .
Se for tela toda pode ser feito assim ->
var
  Pt : TPoint;
begin
  .
  .
  Bitmap.LoadFromClipboardFormat(CF_BitMap,Clipboard.GetAsHandle(CF_BitMap),0);
  GetCursorPos(Pt);
  DrawIconEx(Bitmap.canvas.Handle,pt.x,pt.y,GetCursor,0,0,0,0,DI_NORMAL or DI_DEFAULTSIZE);
  Bitmap.SaveToFile(FileName);
  .
  .

Link para o comentário
Compartilhar em outros sites

  • 0

Acho besteira você ficar simulando o PrintScreen. Usa o clipboard e ainda tem que fazer cópia pra bitmap. Por que você não usa assim ->

Para obter um bitmap da janela ativa->

function CreateActiveWindowBitmap : TBitmap;
var
  bm : TBitmap;
  sc, ds : TRect;
  dc : THandle;
  cn : TCanvas;
begin
  bm:=tbitmap.Create;
  GetWindowRect(GetForegroundWindow,sc);
  ds.Top:=0;
  ds.Left:=0;
  ds.Right:=sc.Right-sc.Left;
  ds.Bottom:=sc.Bottom-sc.Top;
  bm.Height:=ds.Bottom;
  bm.Width:=ds.Right;
  dc:=getdc(0);
  cn:=tcanvas.create;
  cn.Handle:=dc;
  bm.Canvas.CopyRect(ds,cn,sc);
  cn.free;
  result:=bm;
end;
Para obter um bitmap da tela->
function CreateScreenBitmap : TBitmap;
var
  bm : TBitmap;

  dc : THandle;
begin
  bm:=tbitmap.Create;
  bm.Height:=GetSystemMetrics(SM_CYSCREEN);
  bm.Width:=GetSystemMetrics(SM_CXSCREEN);
  dc:=getdc(0);
  BitBlt(bm.Canvas.Handle,0,0,bm.Width,bm.Height,dc,0,0,srccopy);
  releasedc(0,dc); //não sei se é necessário
  result:=bm;
end;
Exemplo->
procedure TForm1.Button1Click(Sender: TObject);
var bm : TBitmap;
begin
  bm:=CreateActiveWindowBitmap;
  bm.SaveToFile('c:\teste.bmp');
  bm.Free;
end;

Link para o comentário
Compartilhar em outros sites

  • 0

Realmente , amigo Thales.

O problema é a minha falta de experiência mesmo!!

No fim de semana vou tentar, adaptando no meu código.

Pois já tenho ele na cabeça.

Depois vou reescrever com o seu.

Valeu pela força.

Editado por Paulo Nobre
Link para o comentário
Compartilhar em outros sites

  • 0

Ué, não entendi. Agora os HotKeys estão funcionando mesmo com a janela minimizada?
Estão funcionando sim.
Observação: Nesse código você está usando um TImage pra puxar do clipboard, mas se a imagem não tiver que aparecer no form é melhor usar apenas um TBitmap.
Sempre que a imagem é capturada ela aparece num image. Se o usuário clicar nela tem a oportunidade de abrí-la numa janela maior para ver detalhes.
Pergunta: É realmente necessário tantos acessos ao registro? Por que você não usa arquivos normais que ficam junto com o programa, é bem melhor.
Tenho mania de fazer uso abundante do registro para armazenar todas as informações do programa. O que você chama de arquivos normais que ficam juntos do programa? Seriam INI. Se for, não tenho hábito de usá-los. Prefiro o registro.
Como o usuário faz para determinar qual a área da tela quer capturar quando o modo de captura é 'Parte da Tela'?
Quando ele escolhe capturar uma parte da tela, esta opção aciona um timer e além disso a tecla F2 é usada para isto, junto com o mouse.
procedure TfrmPrincipal.TimerParteDaTelaTimer(Sender: TObject);
Var
   formato : Word;
   dados : Cardinal;
   paleta : HPALETTE;
begin
TimerParteDaTela.Enabled:= False;
  try
    if GetKeyState(VK_F2) < 0 then
    begin
      Capturando := True;
      if X1 = 0 then
        begin
          X1 := Mouse.CursorPos.X;
          Y1 := Mouse.CursorPos.Y;
          X2 := X1;
          Y2 := Y1;
        end
      else
        if (X2 <> Mouse.CursorPos.X) or (Y2 <> Mouse.CursorPos.Y) then
          begin
            Canv.Rectangle(X1, Y1, X2, Y2);
            X2 := Mouse.CursorPos.X;
            Y2 := Mouse.CursorPos.Y;
            Canv.Rectangle(X1, Y1, X2, Y2);
          end;
    end
    else
      if Capturando then
        begin
          Canv.Rectangle(X1, Y1, X2, Y2);
          Timer1.Enabled:=True;
          CopiaTela(Image1.Picture.Bitmap, X1, Y1, X2, Y2);
          Image1.Picture.SaveToClipBoardFormat(formato, dados, paleta);
          ClipBoard.SetAsHandle(formato, dados);
          X1 := 0;
          Capturando := False;
        end
      Else
        begin
          //SetSystemCursor(LoadCursor(0,IDC_Cross),OCR_Normal);
        end;
  finally
    TimerParteDaTela.Enabled:= True;
  end;
end;

Isto tudo está funcionado redondinho agora.

Vou testar ananhã o código que você me passou.

Link para o comentário
Compartilhar em outros sites

  • 0
Quando ele escolhe capturar uma parte da tela, esta opção aciona um timer e além disso a tecla F2 é usada para isto, junto com o mouse.

interessante.

Não vou forçar muito a mente para entender esse seu procedimento porque senão pode começar a feder.

Mas deixa eu ver se eu peguei a idéia: O usuário posiciona o mouse numa ponta do retangulo, pressiona uma tecla, arrasta o mouse até a outra ponta do retangulo e depois solta a tecla. é isso?

Tenho mania de fazer uso abundante do registro para armazenar todas as informações do programa.

O que você chama de arquivos normais que ficam juntos do programa? Seriam INI.

Se for, não tenho hábito de usá-los. Prefiro o registro.

Não me referia a ini's, mas sim a arquivos binários normais, aonde você salvaria as variáveis diretamente. Se você souber algumas técnicas de acesso a arquivos, por exemplo a de montar uma estrutura de fila encadeada dentro do arquivo, e escrever umas rotinas de acesso legais, e usar sistema de constantes identificadoras, tudo isso ajudaria na versatilidade ao acesso ao arquivo, ficaria melhor do que trabalhar com o registro. mas a opção é sua.

Link para o comentário
Compartilhar em outros sites

  • 0

Mas deixa eu ver se eu peguei a idéia: O usuário posiciona o mouse numa ponta do retangulo, pressiona uma tecla, arrasta o mouse até a outra ponta do retangulo e depois solta a tecla. é isso?
Acertou na mosca Thales.
Não me referia a ini's, mas sim a arquivos binários normais, aonde você salvaria as variáveis diretamente. Se você souber algumas técnicas de acesso a arquivos, por exemplo a de montar uma estrutura de fila encadeada dentro do arquivo...

Grego, para mim Thales.

Um dia, quem sabe, vou chegar a sacar um milésimo do que vocês sabem!!

Se quiser, depois que eu implementar a captura do ponteiro do mouse, mando o projeto completo para você.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Um dia, quem sabe, vou chegar a sacar um milésimo do que vocês sabem!!

Que é isso, se você se propor a ler o arquivo de ajuda do Delphi você aprende rapidinho.

Se quiser, depois que eu implementar a captura do ponteiro do mouse, mando o projeto completo para você.

Pode mandar, inclusive eu queria aquele dos papéis de parede também.

Link para o comentário
Compartilhar em outros sites

  • 0

Thales,

Coloquei aquele código que você forneceu como sugestão dentro do meu

Bitmap.LoadFromClipboardFormat(CF_BitMap,Clipboard.GetAsHandle(CF_BitMap),0);
  GetCursorPos(Pt);
  GetWindowRect(GetForegroundWindow,Rt);
  DrawIconEx(Bitmap.canvas.Handle,pt.x-rt.left,pt.y-rt.top,GetCursor,0,0,0,0,DI_NORMAL or DI_DEFAULTSIZE);
  Bitmap.SaveToFile(FileName);

Mas, tá dando erro de "Object or class type requerid" e pior é que a segunda linha de erro diz esperado except ou finally.

O erro inicial é para a linha do DrawIconEx.

Tem que acrescentar alguma unit?

Link para o comentário
Compartilhar em outros sites

  • 0

Só lembrando que essa ultima linha aí só deve ser colocada quando você for salvar o arquivo, e deve existir a variável FileName que acrescentei só por exemplo.

Mas eu não sei porque que tá dando esse erro não. Posta o procedimento todo por favor.

PS: mandei uma MP pra você sobre o exe do troca papel.

Link para o comentário
Compartilhar em outros sites

  • 0

DrawIconEx(Bitmap.canvas.Handle,pt.x-rt.left,pt.y-rt.top,GetCursor,0,0,0,0,DI_NORMAL or DI_DEFAULTSIZE);
Tirando o bitmap compila mas nada acontece, ou seja não dá erro mas também não desenha o ponteiro.
DrawIconEx(canvas.Handle,pt.x-rt.left,pt.y-rt.top,GetCursor,0,0,0,0,DI_NORMAL or DI_DEFAULTSIZE);
Procedure TfrmPrincipal.CapturarSalvarBitmap(Filename:TFilename);
Var
  Bmp:TBitmap;
rt:trect;
pt:Tpoint;
begin
  try
  Bmp := TBitmap.Create;
  Bmp.LoadFromClipboardFormat(CF_BitMap, Clipboard.GetAsHandle(CF_Bitmap), 0);
GetCursorPos(Pt);
  GetWindowRect(GetForegroundWindow,Rt);
  DrawIconEx(Bitmap.canvas.Handle,pt.x-rt.left,pt.y-rt.top,GetCursor,0,0,0,0,DI_NORMAL or DI_DEFAULTSIZE);
  Image1.Picture.Bitmap.Assign(Bmp);
  Bmp.SaveToFile(FileName);
  Bmp.Free;
  except
    begin
      Messagebox(0,'Se você está capturando parte da tela, ATENÇÃO!!!   '+#13+'É necessário ficar com a tecla F3 apertada para capturar parte da tela.  '+#13+ 'Por favor leia as dicas do programa FLASH.     ','ERRO AO CAPTURAR',MB_IconStop);
      reg.RootKey:=HKEY_LOCAL_MACHINE;
      reg.OpenKey('SOFTWARE\NOBRE INFORMÁTICA\FLASH',True);
      Image1.Picture.LoadFromFile(reg.readString('Último Shot'));
      reg.CloseKey;
      Abort;
    end;
  end;
end;
PS: mandei uma MP pra você sobre o exe do troca papel.

Não recebi nenhuma MP!

Link para o comentário
Compartilhar em outros sites

  • 0

Claro que não está funcionando, você declara a variavel bmp e passa a variavel Bitmap como parametro para DrawIconEx.

E na linha Bmp.savetofile(FileName);

Que variavel é essa FileName?

Não recebi nenhuma MP!

Putz! Eu escreví quase uma edição inteira da folha de São Paulo e você não recebeu! Que m****!

Link para o comentário
Compartilhar em outros sites

  • 0

FileName é a variável destino do timer.

Lembra o timer do post anterior:

procedure TfrmPrincipal.Timer1Timer(Sender: TObject);
Var
  Destino:String;
  Numero:Integer;
  ScreensSalvos: Integer;
begin
  Timer1.Enabled:=False;
  reg.RootKey:=HKEY_LOCAL_MACHINE;
  reg.OpenKey('SOFTWARE\NOBRE INFORMÁTICA\FLASH',FALSE);
  Numero:= reg.ReadInteger('Número do último screen salvo')+ 1;
  ScreensSalvos:= reg.ReadInteger('Screens Salvos')+ 1;
  If reg.ReadString('Formato')= 'BMP' then
      begin
        Destino:= reg.ReadString('Diretório de Destino')+'\Flash'+IntToStr(Numero)+'.bmp';
        CapturarSalvarBitmap(Destino);
      end
  Else If reg.ReadString('Formato')= 'JPEG' then
      begin
        Destino:= reg.ReadString('Diretório de Destino')+'\Flash'+IntToStr(Numero)+'.jpeg';
        CapturarSalvarJPEG(Destino);
      end
  Else If reg.ReadString('Formato')= 'GIF' then
     begin
        Destino:= reg.ReadString('Diretório de Destino')+'\Flash'+IntToStr(Numero)+'.gif';
        CapturarSalvarGIF(Destino);
      end;

  reg.WriteInteger('Número do último screen salvo',Numero);
  Label2.Caption:= IntToStr(ScreensSalvos);
  reg.WriteInteger('Screens Salvos',ScreensSalvos);
  reg.WriteString('Último Shot',Destino);
  reg.CloseKey;
  
  //Manda o form para frente.
  SetForegroundWindow(handle);
end;
Tenho este timer pois o usuário pode escolher capturar de tempos em tempos. DE acordo com a escolha nas configuraçoes ele salva com uma terminação num diretório.
Claro que não está funcionando, você declara a variavel bmp e passa a variavel Bitmap como parametro para DrawIconEx.
Tem como resolver isto?
Putz! Eu escreví quase uma edição inteira da folha de São Paulo e você não recebeu! Que m****!

Manda direto para o meu email!

Link para o comentário
Compartilhar em outros sites

  • 0

Substitua o comando por esse ->

DrawIconEx(Bmp.canvas.Handle,pt.x-rt.left,pt.y-rt.top,GetCursor,0,0,0,0,DI_NORMAL or DI_DEFAULTSIZE);

Manda direto para o meu email!

Vou mandar.

Será que a MP foi pra outro usuário? Eu tenho certeza que mandei pra você. Estranho.

Link para o comentário
Compartilhar em outros sites

  • 0

Funcionou Thales,

Só que como sabe tenho a opção de salvar a imagem em JPEG e GIF.

Procedure TfrmPrincipal.CapturarSalvarJPEG(Filename:TFilename);
Var
  JPEG:TJPEGImage;
begin
  Try
  //Primeiro você cria o JPEG:
  JPEG := TJPEGImage.Create;
  //Depois você carrega o bitmap do Image pelo Clipboard:
  Image1.Picture.Bitmap.LoadFromClipboardFormat(CF_BitMap,Clipboard.GetAsHandle(CF_BitMap),0);
  //Depois você assinala o JPEG a partir do Bitmap:
  JPEG.Assign(Image1.Picture.Bitmap);
  //Depois você salva o JPEG:
  JPEG.SaveToFile(FileName);
  JPEG.Free;
  except
    begin
      Messagebox(0,'Se você está capturando parte da tela, ATENÇÃO!!!   '+#13+'É necessário ficar com a tecla F3 apertada para capturar parte da tela.  '+#13+ 'Por favor leia as dicas do programa FLASH.     ','ERRO AO CAPTURAR',MB_IconStop);
      reg.RootKey:=HKEY_LOCAL_MACHINE;
      reg.OpenKey('SOFTWARE\NOBRE INFORMÁTICA\FLASH',True);
      Image1.Picture.LoadFromFile(reg.readString('Último Shot'));
      reg.CloseKey;
      Abort;
    end;
  end;
end;

//A procedure abaixo serve para salvar o desktop mostrar e salvar
//gif no diretório escolhido.
Procedure TfrmPrincipal.CapturarSalvarGIF(Filename:TFilename);
Var
  Bitmap: TBitmap;
  Gif:TGifImage;
begin
  try
    begin
      Bitmap := TBitmap.Create;
      Gif:= TGifImage.Create;
      Image1.Picture.Bitmap.LoadFromClipboardFormat(CF_BitMap,Clipboard.GetAsHandle(CF_BitMap),0);
      BitmapToGif(Bitmap,Gif);
      Gif.Assign(Image1.Picture.Bitmap);
      Gif.SaveToFile(FileName);
      Bitmap.Free;
      Gif.Free;
    end;
  except
    begin
      Messagebox(0,'Se você está capturando parte da tela, ATENÇÃO!!!   '+#13+'É necessário ficar com a tecla F3 apertada para capturar parte da tela.  '+#13+ 'Por favor leia as dicas do programa FLASH.     ','ERRO AO CAPTURAR',MB_IconStop);
      reg.RootKey:=HKEY_LOCAL_MACHINE;
      reg.OpenKey('SOFTWARE\NOBRE INFORMÁTICA\FLASH',True);
      Image1.Picture.LoadFromFile(reg.readString('Último Shot'));
      reg.CloseKey;
      Abort;
    end;
  end;
end;
e
Procedure TfrmPrincipal.CapturarSalvarGIF(Filename:TFilename);
Var
  Bitmap: TBitmap;
  Gif:TGifImage;
begin
  try
    begin
      Bitmap := TBitmap.Create;
      Gif:= TGifImage.Create;
      Image1.Picture.Bitmap.LoadFromClipboardFormat(CF_BitMap,Clipboard.GetAsHandle(CF_BitMap),0);
      BitmapToGif(Bitmap,Gif);
      Gif.Assign(Image1.Picture.Bitmap);
      Gif.SaveToFile(FileName);
      Bitmap.Free;
      Gif.Free;
    end;
  except
    begin
      Messagebox(0,'Se você está capturando parte da tela, ATENÇÃO!!!   '+#13+'É necessário ficar com a tecla F3 apertada para capturar parte da tela.  '+#13+ 'Por favor leia as dicas do programa FLASH.     ','ERRO AO CAPTURAR',MB_IconStop);
      reg.RootKey:=HKEY_LOCAL_MACHINE;
      reg.OpenKey('SOFTWARE\NOBRE INFORMÁTICA\FLASH',True);
      Image1.Picture.LoadFromFile(reg.readString('Último Shot'));
      reg.CloseKey;
      Abort;
    end;
  end;
end;
DrawIconEx(Bmp.canvas.Handle,pt.x-rt.left,pt.y-rt.top,GetCursor,0,0,0,0,DI_NORMAL or DI_DEFAULTSIZE);

Poderei adaptar o código acima?

tentei jpeg.canvas.handle e deu errado.

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
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...