Fórum capturar evento de scroll da roda do mouse fora da aplicação #366112
12/11/2008
0
quando eu digo fora, quero dizer com ela rodando, porem não estando ativa, mas minimizada.
Vitor Rubio
Curtir tópico
+ 0Posts
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...
Gostei + 0
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.
Gostei + 0
13/11/2008
Vitor Rubio
Gostei + 0
13/11/2008
Wdrocha
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 | 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
Gostei + 0
13/11/2008
Wdrocha
Flw
Gostei + 0
13/11/2008
Vitor Rubio
Gostei + 0
13/11/2008
Vitor Rubio
Gostei + 0
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.
Gostei + 0
13/11/2008
Wdrocha
talvez vc consiga encontrar algo no site Torry´s Delphi...
Gostei + 0
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.
1 2 | 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:
1 2 3 4 5 6 7 8 9 | type TMSLLHOOKSTRUCT = packed record pt: TPoint; mouseData: Integer; flags: DWORD; time: DWORD; dwExtraInfo: PULONG; end; PTMSLLHOOKSTRUCT = ^TMSLLHOOKSTRUCT; |
Como eu modifiquei a function
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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:
1 | 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:
Gostei + 0
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...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)