Paulo Nobre Postado Outubro 19, 2006 Denunciar Share Postado Outubro 19, 2006 As funções abaixo servem para capturar screens...capturar a tela todaKeybd_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 acimaKeybd_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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 19, 2006 Denunciar Share Postado Outubro 19, 2006 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 19, 2006 Autor Denunciar Share Postado Outubro 19, 2006 "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 deKeybd_Event(VK_Snapshot,0, 0, 0);fazer uma chamada a tecla print. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 19, 2006 Denunciar Share Postado Outubro 19, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 20, 2006 Autor Denunciar Share Postado Outubro 20, 2006 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 20, 2006 Denunciar Share Postado Outubro 20, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 20, 2006 Autor Denunciar Share Postado Outubro 20, 2006 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 20, 2006 Denunciar Share Postado Outubro 20, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 20, 2006 Denunciar Share Postado Outubro 20, 2006 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); . . Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 20, 2006 Denunciar Share Postado Outubro 20, 2006 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; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 20, 2006 Autor Denunciar Share Postado Outubro 20, 2006 (editado) 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 Outubro 20, 2006 por Paulo Nobre Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 20, 2006 Denunciar Share Postado Outubro 20, 2006 Realmente , amigo Thiago.Opa, que Thiago??????????????????!!!!!!!!!!!!!!?????????????????!!!!!!!!1 :blink: :huh: :o :unsure: Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 20, 2006 Autor Denunciar Share Postado Outubro 20, 2006 Opa, que Thiago??????????????????!!!!!!!!!!!!!!?????????????????!!!!!!!! OPA, foi mal.Perdão, amigo Thales.Estava digitando com uns colegas me zoando ao meu lado. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 20, 2006 Denunciar Share Postado Outubro 20, 2006 Acontece.Quando tiver um tempo, responda as perguntas do post #8. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 20, 2006 Autor Denunciar Share Postado Outubro 20, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 20, 2006 Denunciar Share Postado Outubro 20, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 21, 2006 Autor Denunciar Share Postado Outubro 21, 2006 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 21, 2006 Denunciar Share Postado Outubro 21, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 21, 2006 Autor Denunciar Share Postado Outubro 21, 2006 Thales, Mandei um MP para você, para você me dizer para qual email posso mandar o projeto papel de parede. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 21, 2006 Autor Denunciar Share Postado Outubro 21, 2006 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 21, 2006 Denunciar Share Postado Outubro 21, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 21, 2006 Autor Denunciar Share Postado Outubro 21, 2006 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! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 21, 2006 Denunciar Share Postado Outubro 21, 2006 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****! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 21, 2006 Autor Denunciar Share Postado Outubro 21, 2006 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! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 21, 2006 Denunciar Share Postado Outubro 21, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 21, 2006 Autor Denunciar Share Postado Outubro 21, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Paulo Nobre
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
33 respostass a esta questão
Posts Recomendados
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.