capturar evento de scroll da roda do mouse fora da aplicação
12/11/2008
0
quando eu digo fora, quero dizer com ela rodando, porem não estando ativa, mas minimizada.
Vitor Rubio
Posts
13/11/2008
Wdrocha
Vc pode usar uma HookProcedure pra isso...
Onde a Hook pod ser ligada ao iniciar sua aplicação e enquanto a mesma estiver rodando.....esta procedure vai interceptar todas as mensagens do mouse na fila de mensagens do Windows......tanto o scroll quanto os clicks....
outro dia....eu precisei d algo assim....mas eu precisava dos clicks do mouse.....se vc quiser.....eu t passo um exemplo...
Flw...
13/11/2008
Vitor Rubio
estou precisando criar um esquema de mouse gestures para o meu programa.
não consegui registrar uma hotkey com ctrl+shift+wheel do mouse.
Se fosse possivel a minha aplicação, não importa se está minimizada ou em segundo plano, interceptar o pressionamento de ctrl+shift e o rolamento do scroll seria ótimo.
13/11/2008
Vitor Rubio
13/11/2008
Wdrocha
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, AppEvnts, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button_StartJour: TButton; Button_StopJour: TButton; ListBox1: TListBox; Edit1: TEdit; procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); procedure Button_StartJourClick(Sender: TObject); procedure Button_StopJourClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); private { Private declarations } FHookStarted : Boolean; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} var JHook, HandleJanela: THandle; Pos : TPoint; ClasseComponent : Pchar; // O procedimento Hook JournalRecordProc é uma rechamada definida pela aplicação ou definida por uma biblioteca. //Função usada com a função SetWindowsHookEx. //A função registra mensagens que o sistema retira da fila de mensagem do sistema. //Um procedimento de Hook JournalRecordProc não precisa estar necessariamente em uma DLL. // Este procedimento pode estar na própria aplicação. // WH_JOURNALPLAYBACK Hook Function //Syntax // JournalPlaybackProc( // nCode: Integer; {Código Hook } // wParam: WPARAM; {Este parâmetro não é usado} // lParam: LPARAM {ponteiro para TEventMsg structure} // ): LRESULT; function JournalProc(Code, wParam: Integer; var EventStrut: TEventMsg): Integer; stdcall; var s: string; begin {Está é JournalRecordProc} Result := CallNextHookEx(JHook, Code, wParam, Longint(@EventStrut)); if Code < 0 then Exit; {Cancelar operação} if Code = HC_SYSMODALON then Exit; if Code = HC_ACTION then begin { O parâmetro lParam contém um ponteiro para um TEventMsg que contém informações sobre a mensagem removida da fila de mensagens do sistema. } s := ´´; if EventStrut.message = WM_LBUTTONUP then Begin s := ´Left Mouse UP at X pos ´ + IntToStr(EventStrut.paramL) + ´ and Y pos ´ + IntToStr(EventStrut.paramH); Pos.X := EventStrut.paramL; Pos.Y := EventStrut.paramH; HandleJanela := WindowFromPoint(Pos); ClasseComponent := AllocMem(50); S := S + ´ - ´ + IntToStr (GetClassName(HandleJanela, ClasseComponent, 50)); End; if EventStrut.message = WM_LBUTTONDOWN then Begin s := ´Left Mouse Down at X pos ´ + IntToStr(EventStrut.paramL) + ´ and Y pos ´ + IntToStr(EventStrut.paramH); Pos.X := EventStrut.paramL; Pos.Y := EventStrut.paramH; HandleJanela := WindowFromPoint(Pos); ClasseComponent := AllocMem(50); S := S + ´ - ´ + IntToStr (GetClassName(HandleJanela, ClasseComponent, 50)); End; if EventStrut.message = WM_RBUTTONDOWN then Begin s := ´Right Mouse Down at X pos ´ + IntToStr(EventStrut.paramL) + ´ and Y pos ´ + IntToStr(EventStrut.paramH); Pos.X := EventStrut.paramL; Pos.Y := EventStrut.paramH; HandleJanela := WindowFromPoint(Pos); ClasseComponent := AllocMem(50); S := S + ´ - ´ + IntToStr (GetClassName(HandleJanela, ClasseComponent, 50)); End; if (EventStrut.message = WM_RBUTTONUP) then Begin s := ´Right Mouse Up at X pos ´ + IntToStr(EventStrut.paramL) + ´ and Y pos ´ + IntToStr(EventStrut.paramH); Pos.X := EventStrut.paramL; Pos.Y := EventStrut.paramH; HandleJanela := WindowFromPoint(Pos); ClasseComponent := AllocMem(50); S := S + ´ - ´ + IntToStr (GetClassName(HandleJanela, ClasseComponent, 50)); End; if (EventStrut.message = WM_MOUSEWHEEL) then s := ´Mouse Wheel at X pos ´ + IntToStr(EventStrut.paramL) + ´ and Y pos ´ + IntToStr(EventStrut.paramH); {if (EventStrut.message = WM_MOUSEMOVE) then s := ´Mouse Position at X:´ + IntToStr(EventStrut.paramL) + ´ and Y: ´ + IntToStr(EventStrut.paramH); } //ShowMessage(ClasseComponent); if s <> ´´ then Begin Form1.ListBox1.ItemIndex := Form1.ListBox1.Items.Add(s); Form1.Edit1.Text := ClasseComponent; //Tipo de componente que foi clicado pelo usuário End; end; end; procedure TForm1.Button_StartJourClick(Sender: TObject); begin if FHookStarted then begin ShowMessage(´A hook já está estartada´); Exit; end; JHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalProc, hInstance, 0); if JHook > 0 then begin FHookStarted := True; end else ShowMessage(´No Journal Hook availible´); end; procedure TForm1.Button_StopJourClick(Sender: TObject); begin FHookStarted := False; UnhookWindowsHookEx(JHook); JHook := 0; end; procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); begin {cancela a hook se for pressionada Control + Alt + Del ou Control + Esc} Handled := False; if (Msg.message = WM_CANCELJOURNAL) and FHookStarted then JHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalProc, 0, 0); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if FHookStarted then UnhookWindowsHookEx(JHook); end; Procedure TForm1.FormCreate(Sender: TObject); Begin JHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalProc, hInstance, 0); End; End.
Vc pod fazer N coisas com essa procedure....espero ter sido útil....
Flw
13/11/2008
Wdrocha
Flw
13/11/2008
Vitor Rubio
13/11/2008
Vitor Rubio
13/11/2008
Vitor Rubio
Tentei dar um getmessage, ou então mudar o eventmessage para um ´twheel não sei o que ´ mas não deu certo. o wparam vem 0. não consigo saber a direção em que a roda está girando.
13/11/2008
Wdrocha
talvez vc consiga encontrar algo no site Torry´s Delphi...
14/11/2008
Vitor Rubio
Achei um exemplo chamado ´LowLevelMouseHook ´ no [url]http://www.torry.net/quicksearchd.php?String=mouse&Title=Yes [/url]
mas era um exemplo que usava dll, e tambem tinha muitas funções que eu não precisava, então eu arrumei um jeito de mesclar ela com o código que você me passou.
Bom, sempre numa função hookada do windows o wparam vai ter o mesmo codigo da mensagem. O lparam pode ser um simples inteiro com informações adicionais ou um ponteiro para uma estrutura com muitas outras informações (e outros ponteiros).
Tive que usar o WH_MOUSE_LL no lugar de WH_JOURNALPLAYBACK.
(O nome dessas coisas são mensagens de hook ou funções de hook?)
bom, de onde eu tirei essa WH_MOUSE_LL?
Tem varias dessas que não estão na unit windows do delphi, mas tem na api do windows. Tive que declarar, o valor dela é 14.
const WH_MOUSE_LL = 14;
esses links ajudaram bastante:
[url]http://msdn.microsoft.com/en-us/library/ms644959(VS.85).aspx[/url]
[url]http://msdn.microsoft.com/en-us/library/ms644970(VS.85).aspx[/url]
o segundo tem o tipo de estrutura a qual o lparam é um ponteiro para ela.
Estou exibindo o mousedata dessa estrutura em um edit. quando é negativo é rolagem para baixo, e quando é positivo é rolagem para cima.
a estrutura:
type TMSLLHOOKSTRUCT = packed record pt: TPoint; mouseData: Integer; flags: DWORD; time: DWORD; dwExtraInfo: PULONG; end; PTMSLLHOOKSTRUCT = ^TMSLLHOOKSTRUCT;
Como eu modifiquei a function
function JournalProc(Code: Integer; wParam, lParam:DWORD): LongInt; stdcall; var msg: tagMSG; begin {Está é JournalRecordProc} //sei la como ela vai se chamar agora Result := CallNextHookEx(frmTransp.JHook, Code, wParam, lParam); if Code < 0 then Exit; {Cancelar operação} if Code = HC_SYSMODALON then Exit; if Code = HC_ACTION then begin if (wParam = WM_MOUSEWHEEL) then begin frmTransp.Edit1.Text := IntToStr(PTMSLLHOOKSTRUCT(lParam)^.mouseData); end; end; end;
como eu registrei:
JHook := SetWindowsHookEx(WH_MOUSE_LL, @JournalProc, 0, 0);
com isso eu consegui criar um programa que captura o handle de qualquer janela ativa com getForegroundWindow e deixa ela semitransparente ou opaca ao se segurar uma tecla de atalho e rolar o wheel do mouse para frente ou para tras.
Nesse link do msdn tem outras hooks, de teclado, de mouse... um monte.
Espero que seja util a você.
:wink:
14/11/2008
Wdrocha
olhei os links q vc me passou....
Eu tow tentando fazer um Keylogger....e as hooks procedures do teclado serão mt úteis...obrigado...
e o nome é Hook Procedure ...
dá uma olhada nesse tópico q é mt interessante....
[url]http://forum.devmedia.com.br/viewtopic.php?t=78248&sid=b989861f9eb0c1d546954fd6c61bb61f[/url]
vc vai gostar....quem sabe possamos construir alguma aplicação do tipo...
Clique aqui para fazer login e interagir na Comunidade :)