Ir para conteúdo
Fórum Script Brasil

Thales Pontes Martins

Membros
  • Total de itens

    453
  • Registro em

  • Última visita

Tudo que Thales Pontes Martins postou

  1. 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;
  2. Na documentação do Windows diz que essa função está presente desde o Windows 95.
  3. 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); . .
  4. 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.
  5. 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. 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.
  6. Joey, acho que ele não está se referindo a isso, acho que a função não levanta exceção, mas só mostra uma menssagem de erro.
  7. Que nada, se ele estivesse aqui teria resolvido o problema no 1º post. Assim não dá, ele ia cortar o meu barato de postar 27 vezes em 1 dia.
  8. Se você disser o nome das funções que está usando fica mais fácil de agente pesquisar esse erro.
  9. procedure TForm1.FormCreate(Sender: TObject); var ini: TInifile; //declarar variavel const IniName='inicial.ini';//coloque aqui o caminho onde sera salvo o arquivo begin ini:= Tinifile.Create(ExtractFilePath(Application.ExeName)+IniName);//aqui você estancia o arquivo edit1.text:= ini.readstring('dados','dolar',''); //leitura da chave de dados dolar edit2.Text:= ini.readstring('dados','Produto',''); //leitura da chave de dados produto ini.Free;// liberar o arquivo end;
  10. É porque ele não está com simbolo de movido, está com simbolo normal.
  11. Bem lembrado, Micheus, essa função me parece perfeita já que roda em uma thread individual e eliminaria o problema de o evento não ocorrer enquanto se está processando código. É igual a quando você define um timer por exemplo pra fazer um relógio funcionar em uma label, o relógio está andando direitinho, mas se usuário clicar em um botão e o evento seje um procedimento que demore 5 minutos, então o relógio não vai funcionar durante esses 5 minutos porque o evento não é executado enquanto se está processando código, porque as mensagens de um TTimer são processadas pela thread principal. A solução seria ter esse procedimento executado por uma thread aparte para que a thread principal permaneça em idle e se dedique apenas a processar as menssagens, incluindo as do Timer. Então o programa do Max tem a thread principal que fica idle, a classe que ele está escrevendo que é a thread que ficará executando o código, e uma 3º thread que ficará executando callbacks do timer. Mas se a 2º thread ficará executando código e a 1º ficará idle, a classe dele poderia ter a thread principal a criar o Timer, aí os eventos de Timer seriam executados em concorrencia com o código e se economizaria a criação de mais uma thread.
  12. Micheus, a que devemos a honra de sua presença? Já estava quase postando outra vez pra completar 60. :lol: Pensei que você estava no Beto Carrero. Ainda bem que você não morreu, senão agente ficava sem suporte. :)
  13. porque você não usa variável ao invés de constante?????!!!!???!?!?!?!?!?!?!?!?!?!?!?! :huh: :unsure: :o :o :unsure: :unsure: :blink: :blink:
  14. 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.
  15. então nesse caso deverá funcionar. É verdade, nesse caso como ele quer repetir a cada 3 segundos era bem mais simples fazer com GetTickCount. Lembrando-se do problema dos 50 dias, que poderia travar o programa, mas sabendo filtrar esse erro, resolveria o problema tranquilamente. É verdade, o ProcessMessages quando é chamado dentro do procedimento de um evento, e já tiver uma mensagem pra rodar aquele mesmo procedimento na fila, pode causar uma recursão e muita dor de cabeça, falo por experiencia própria porque já me deparei com esse problema e a solução foi executar a operação em outra thread.
  16. 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?
  17. Foi exatamente isso que eu disse pra ele fazer, só resta saber se Application.ProcessMessages vai também processar a fila dessa thread pois se não me engano, cada thread tem sua própria fila. Mas não custa tentar.
  18. E lembre-se que é preciso liberar o Timer assim que a thread terminar com a api KillTimer.
  19. Meu amigo, você está se esquecendo que uma mensagem de TimeOut postada a fila de mensagems não é retirada sozinha de lá, você tem que processar as mensagems da fila no seu método execute. ok? E quanto a função de callback, ela só roda quando a aplicação está em idle, nesse caso a sua thread está sempre rodando um código dentro daquela repetição while, então se ela está rodando aquele código ela não pode rodar ao mesmo tempo a procedure de callback, certo? ;)
  20. Bruno, ou o tópico foi movido ou você tá doidão, porque aqui é o Fórum de Delphi.
  21. Resolveu???????????????? Se não, os outros colegas aí também podem ajudar, heim, ouviram?
  22. Quero deixar claro que só mencionei as funções de CALLBACK aqui a título de curiosidade, e que o componente TTimer funciona perfeitamente bem dentro de componentes, utilizo ele e sempre funcionou. vocês é que devem estar fazendo alguma coisa errada. Vejam um exemplo-> T3dQueen = Class(TComponent) public List : TDragOperation; bm : TBitmap; _owner : TForm; PosInc, hinc, vinc : Double; Sub, Dir : boolean; x, y : Double; cam : TCamera; rect : TRect; q3 : TPolQueen; sort : TSort; pol4 : T4pol2d; pol3 : T3pol2d; light : double; hue : word; lum : double; sat, hc, speed, randh, randv : double; divisor, dividendo : cardinal; _Timer : TTimer; constructor Create(AOwner: TForm; src : TCanvas = nil); destructor Destroy; override; procedure Timer(Sender : TObject); procedure DrawQueen; procedure RandomCam; procedure UpCam; end; implementation constructor T3dQueen.Create(AOwner: TForm; src : TCanvas = nil); begin inherited Create(AOwner); Randomize; _owner:=AOwner; bm:=TBitmap.Create; bm.Height:=134; bm.Width:=134; rect.Top:=0; rect.Left:=0; rect.Right:=133; rect.Bottom:=133; bm.Canvas.FillRect(rect); List:=TDragOperation.CreateTransparent(bm); PosInc:=1; dir:=true; sub:=false; x:=0; y:=0; cam.z:=0; sort:=InitSort; speed:=70; RandomCam; hue:=0; lum:=1.25; sat:=0; divisor:=180; dividendo:=180; hc:=2.4; if (src = nil) then List.TransparentBegin(trunc(x),trunc(y),_owner.Canvas, _owner.canvas) else List.TransparentBegin(trunc(x),trunc(y),_owner.Canvas, src); //I had to use Timer component because callback timer function seemed //not to work with object methods. _Timer:=TTimer.Create(self); _Timer.Interval:=16; _Timer.OnTimer:=Timer; _Timer.Enabled:=true; end; destructor T3dQueen.Destroy; begin _Timer.Enabled:=false; _Timer.Destroy; List.EndDrag; List.Destroy; bm.Destroy; inherited destroy; end; procedure T3dQueen.Timer(Sender : TObject); begin if (byte(getkeystate(VK_LEFT) ) > 120) then if (hue > 0) then dec(hue) else hue:=1535; if (byte(getkeystate(VK_RIGHT) ) > 120) then if (hue < 1535) then inc(hue) else hue:=0; if (byte(getkeystate(VK_UP) ) > 120) then if (lum < 2) then lum:=lum+0.01; if (byte(getkeystate(VK_DOWN) ) > 120) then if (lum > 0) then lum:=lum-0.01; if (byte(getkeystate(VK_NUMPAD4) ) > 120) then if (sat < 1) then sat:=sat+0.01; if (byte(getkeystate(VK_NUMPAD6) ) > 120) then if (sat > 0) then sat:=sat-0.01; if (byte(getkeystate(VK_LCONTROL) ) > 120) then if (divisor > 20) then dec(divisor); if (byte(getkeystate(VK_RCONTROL) ) > 120) then if (divisor < 800) then inc(divisor); if (byte(getkeystate(VK_LSHIFT) ) > 120) then if (dividendo > 20) then dec(dividendo); if (byte(getkeystate(VK_RSHIFT) ) > 120) then if (dividendo < 800) then inc(dividendo); if (byte(getkeystate(VK_NUMPAD2) ) > 120) then if (hc < 10) then hc:=hc+0.005; if (byte(getkeystate(VK_NUMPAD8) ) > 120) then if (hc > 0.5) then hc:=hc-0.005; if (byte(getkeystate(VK_NUMPAD9) ) > 120) then if (posinc < 15) then posinc:=posinc+0.02; if (byte(getkeystate(VK_NUMPAD7) ) > 120) then if (posinc > 0) then posinc:=posinc-0.02; if (byte(getkeystate(VK_NUMPAD1) ) > 120) then if (speed < 500) then begin speed:=speed+1; UpCam; end; if (byte(getkeystate(VK_NUMPAD3) ) > 120) then if (speed > 1) then begin speed:=speed-1; UpCam; end; if (sub) then y:=y-posinc else y:=y+posinc; if (dir) then x:=x+posinc else x:=x-posinc; if (trunc(x) <= -16) then begin dir:=true; RandomCam; end; if (trunc(y) <= -16) then begin sub:=false; RandomCam; end; if (trunc(x) >= _owner.Width-120) then begin dir:=false; RandomCam; end; if (trunc(y) >= _owner.Height-150) then begin sub:=true; RandomCam; end; cam.x:=cam.x+hinc; cam.y:=cam.y+vinc; if (cam.x > 2*pi) then cam.x:=modulus(cam.x,2*pi); if (cam.y > 2*pi) then cam.y:=modulus(cam.y,2*pi); DrawQueen; {if (_owner.showing) then} List.DragMove(trunc(x), trunc(y)); //_owner.Caption:=floattostr(cam.x); //debug end; Esse código é fragmento de um componente real que eu escreví, e coloquei aqui com o intuito de demonstrar a utilização do TTimer dentro de um componente. PS: Se o componente não for derivado de TComponent então pode-se usar o comando _Timer:=TTimer.Create(nil); para criar o Timer que funciona do mesmo jeito.
  23. Gostaria de lembrar que eu escreví esse programa para finalidades específicas, então o retangulo que ele captura da tela só é capturado quando a resolução é maior ou igual a 1024 * 768.
×
×
  • Criar Novo...