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
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.
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:
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 :)