Fórum Print Screen Tela #199207
05/12/2003
0
PESSOAL BOA NOITE!
TO PRECISANDO FAZER UM PROGRAMA DE FORMA QUE QUANDO O USUARIO AO CLICAR EM QUALQUER PONTO DA TELA O MESMO COPIARA A TELA DO WINDOWS E SALVARA EM UM AQUIVO:
POR EXEMPLO ESTOU DIGITANDO ESSE PERGUNTA, COM A TELA FULL SCREEN SE DERREPENTE EU CLICAR COM O MOUSE EM QUALQUER PARTE O PROGRAMA SALVARA A TELA VIRGENTE NO MOMENTO DO CLICK...
GRATO.
[i:fb30dc9285]Título editado pelo Moderador. Digite em minúsculas. (marcelo.c)[/i:fb30dc9285]
TO PRECISANDO FAZER UM PROGRAMA DE FORMA QUE QUANDO O USUARIO AO CLICAR EM QUALQUER PONTO DA TELA O MESMO COPIARA A TELA DO WINDOWS E SALVARA EM UM AQUIVO:
POR EXEMPLO ESTOU DIGITANDO ESSE PERGUNTA, COM A TELA FULL SCREEN SE DERREPENTE EU CLICAR COM O MOUSE EM QUALQUER PARTE O PROGRAMA SALVARA A TELA VIRGENTE NO MOMENTO DO CLICK...
GRATO.
[i:fb30dc9285]Título editado pelo Moderador. Digite em minúsculas. (marcelo.c)[/i:fb30dc9285]
Biriga
Curtir tópico
+ 0
Responder
Posts
05/12/2003
Deus
Muito bem, eu consegui resolver o seu problema, depois de um pouquinho de trabalho. :) É simples, espero que você não se perca no meio da minha explicação:
No form que vai executar esta tarefa, você deverá ter uma variável com de nome [b:7c967350f5]MouseHook[/b:7c967350f5] do tipo [i:7c967350f5]THandle[/i:7c967350f5], e os códigos a seguir para o [i:7c967350f5]OnActivate[/i:7c967350f5] e o [i:7c967350f5]OnClose[/i:7c967350f5] do Form em questão:
Agora, você vai criar uma função dentro do corpo do Form, mas sem referenciá-la na Public, chamada [b:7c967350f5]HookParaMouse[/b:7c967350f5], que irá fazer todo o trabalho sujo. Dentro dela eu coloquei uma função que faz o screenshot, só pra facilitar. :) Enfim:
Agora, vamos à explicação: o que acontece aqui é que o seu form, quando é ativado, executa o código do [i:7c967350f5]OnActivate[/i:7c967350f5], que faz com que a função [b:7c967350f5]HookParaMouse[/b:7c967350f5] receba todas as mensagens que já saíram da pilha de mensagens. Desta forma, a função irá processar as mensagens e, quando for identificada uma do tipo ´WM_MLBUTTONDOWN´, que significa que o botão esquerdo do mouse foi pressionado, ele vai executar a função interna [b:7c967350f5]PegaScreenShot[/b:7c967350f5], que irá tirar um [i:7c967350f5]Print Screen[/i:7c967350f5] e salvá-lo num arquivo (note que eu chamei de [i:7c967350f5]´C:\Screenshot.bmp´[/i:7c967350f5], mas você pode chamá-lo do que quiser). Quando o form for fechado, ele ativará o [i:7c967350f5]OnClose[/i:7c967350f5], que por sua vez cessará o controle das mensagens para a função [b:7c967350f5]HookParaMouse[/b:7c967350f5]. O código fonte para um Form que não tem nenhum componente, e cuja única função e tirar um [i:7c967350f5]Print Screen[/i:7c967350f5] quando o mouse for pressionado em qualquer lugar, até mesmo fora da aplicação, ficaria assim:
Espero que você tenha entendido! Caso não, é só me mandar uma mensagem que tentarei esclarecer quaisquer dúvidas! :)
Um grande abraço, e espero ter sido útil! dEUS[/i]
No form que vai executar esta tarefa, você deverá ter uma variável com de nome [b:7c967350f5]MouseHook[/b:7c967350f5] do tipo [i:7c967350f5]THandle[/i:7c967350f5], e os códigos a seguir para o [i:7c967350f5]OnActivate[/i:7c967350f5] e o [i:7c967350f5]OnClose[/i:7c967350f5] do Form em questão:
procedure TForm1.FormActivate(Sender: TObject); begin MouseHook := SetWindowsHookEx(WH_JOURNALRECORD, @HookParaMouse, hInstance, 0); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin UnhookWindowsHookEx(MouseHook); MouseHook := 0; end;
Agora, você vai criar uma função dentro do corpo do Form, mas sem referenciá-la na Public, chamada [b:7c967350f5]HookParaMouse[/b:7c967350f5], que irá fazer todo o trabalho sujo. Dentro dela eu coloquei uma função que faz o screenshot, só pra facilitar. :) Enfim:
function HookParaMouse(Code, wParam: Integer; var EventStrut: TEventMsg): Integer; stdcall; procedure PegaScreenShot(x, y, Width, Height: Integer; FileName: String); var dc: HDC; lpPal : PLOGPALETTE; bm: TImage; begin bm := TImage.Create(Form1); if ((Width = 0) OR (Height = 0)) then exit; bm.Picture.Bitmap.Width := Width; bm.Picture.Bitmap.Height := Height; dc := GetDc(0); if (dc = 0) then exit; if (GetDeviceCaps(dc, RASTERCAPS) AND RC_PALETTE = RC_PALETTE) then begin GetMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY))); FillChar(lpPal^, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)), #0); lpPal^.palVersion := $300; lpPal^.palNumEntries := GetSystemPaletteEntries(dc,0,256,lpPal^.palPalEntry); if (lpPal^.PalNumEntries <> 0) then BM.Picture.Bitmap.Palette := CreatePalette(lpPal^); FreeMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY))); end; BitBlt(BM.Picture.Bitmap.Canvas.Handle, 0, 0, Width, Height, Dc, x, y, SRCCOPY); if FileExists(FileName) then DeleteFile(FileName); BM.Picture.Bitmap.SaveToFile(FileName); ReleaseDc(0, dc); end; var Char1: PChar; begin Result := CallNextHookEx(MouseHook, Code, wParam, Longint(@EventStrut)); if Code < 0 then Exit; if Code = HC_SYSMODALON then Exit; if Code = HC_ACTION then begin if EventStrut.message = WM_LBUTTONDOWN then PegaScreenShot(0, 0, Screen.Width, Screen.height, ´C:\Screenshot.bmp´) else exit; end; end;
Agora, vamos à explicação: o que acontece aqui é que o seu form, quando é ativado, executa o código do [i:7c967350f5]OnActivate[/i:7c967350f5], que faz com que a função [b:7c967350f5]HookParaMouse[/b:7c967350f5] receba todas as mensagens que já saíram da pilha de mensagens. Desta forma, a função irá processar as mensagens e, quando for identificada uma do tipo ´WM_MLBUTTONDOWN´, que significa que o botão esquerdo do mouse foi pressionado, ele vai executar a função interna [b:7c967350f5]PegaScreenShot[/b:7c967350f5], que irá tirar um [i:7c967350f5]Print Screen[/i:7c967350f5] e salvá-lo num arquivo (note que eu chamei de [i:7c967350f5]´C:\Screenshot.bmp´[/i:7c967350f5], mas você pode chamá-lo do que quiser). Quando o form for fechado, ele ativará o [i:7c967350f5]OnClose[/i:7c967350f5], que por sua vez cessará o controle das mensagens para a função [b:7c967350f5]HookParaMouse[/b:7c967350f5]. O código fonte para um Form que não tem nenhum componente, e cuja única função e tirar um [i:7c967350f5]Print Screen[/i:7c967350f5] quando o mouse for pressionado em qualquer lugar, até mesmo fora da aplicação, ficaria assim:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, jpeg;
type
TForm1 = class(TForm)
procedure FormActivate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
end;
var
Form1: TForm1;
MouseHook: THandle;
implementation
{$R *.dfm}
{ TForm1 }
function HookParaMouse(Code, wParam: Integer; var EventStrut: TEventMsg): Integer; stdcall;
procedure PegaScreenShot(x, y, Width, Height: Integer; FileName: String);
var
dc: HDC; lpPal : PLOGPALETTE;
bm: TImage;
begin
bm := TImage.Create(Form1);
if ((Width = 0) OR (Height = 0)) then exit;
bm.Picture.Bitmap.Width := Width;
bm.Picture.Bitmap.Height := Height;
dc := GetDc(0);
if (dc = 0) then exit;
if (GetDeviceCaps(dc, RASTERCAPS) AND
RC_PALETTE = RC_PALETTE) then
begin
GetMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
FillChar(lpPal^, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)), #0);
lpPal^.palVersion := $300;
lpPal^.palNumEntries := GetSystemPaletteEntries(dc,0,256,lpPal^.palPalEntry);
if (lpPal^.PalNumEntries <> 0) then
BM.Picture.Bitmap.Palette := CreatePalette(lpPal^);
FreeMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
end;
BitBlt(BM.Picture.Bitmap.Canvas.Handle, 0, 0, Width, Height, Dc, x, y, SRCCOPY);
if FileExists(FileName) then
DeleteFile(FileName);
BM.Picture.Bitmap.SaveToFile(FileName);
ReleaseDc(0, dc);
end;
var
Char1: PChar;
begin
Result := CallNextHookEx(MouseHook, Code, wParam, Longint(@EventStrut));
if Code < 0 then Exit;
if Code = HC_SYSMODALON then Exit;
if Code = HC_ACTION then
begin
if EventStrut.message = WM_LBUTTONDOWN then
PegaScreenShot(0, 0, Screen.Width, Screen.height, ´C:\Screenshot.bmp´)
else
exit;
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
MouseHook := SetWindowsHookEx(WH_JOURNALRECORD, @HookParaMouse, hInstance, 0);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnhookWindowsHookEx(MouseHook);
MouseHook := 0;
end;
end.Espero que você tenha entendido! Caso não, é só me mandar uma mensagem que tentarei esclarecer quaisquer dúvidas! :)
Um grande abraço, e espero ter sido útil! dEUS[/i]
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)