且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Trap mouse events outside of my application

更新时间:2022-09-26 09:16:52

unit Unit1; 
interface 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, 
  Dialogs, AppEvnts, StdCtrls; 
type 
  TForm1 
= class(TForm) 
    ApplicationEvents1: TApplicationEvents; 
    Button_StartJour: TButton; 
    Button_StopJour: TButton; 
    ListBox1: TListBox; 
    
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); 
  
private 
    { Private declarations } 
    FHookStarted : Boolean; 
  
public 
    { Public declarations } 
  end; 
var 
  Form1: TForm1; 
implementation 
{$R 
*.dfm} 
var 
  JHook: THandle; 

function JournalProc(Code, wParam: Integer; var EventStrut: TEventMsg): Integer; stdcall; 
var 
  Char1: PChar; 
  s: 
string
begin 
  {
this is the JournalRecordProc} 
  Result :
= CallNextHookEx(JHook, Code, wParam, Longint(@EventStrut)); 
  {the CallNextHookEX 
is not really needed for journal hook since it it not 
  really 
in a hook chain, but it's standard for a Hook} 
  if Code < 0 then Exit; 
  {you should cancel operation 
if you get HC_SYSMODALON} 
  
if Code = HC_SYSMODALON then Exit; 
  
if Code = HC_ACTION then 
  begin 
    { 
    The lParam parameter contains a pointer to a TEventMsg 
    structure containing information on 
    the message removed from the system message queue. 
    } 
    s :
= ''
    
if EventStrut.message = WM_LBUTTONUP then 
      s :
= 'Left Mouse UP at X pos ' + 
        IntToStr(EventStrut.paramL) 
+ ' and Y pos ' + IntToStr(EventStrut.paramH); 
    
if EventStrut.message = WM_LBUTTONDOWN then 
      s :
= 'Left Mouse Down at X pos ' + 
        IntToStr(EventStrut.paramL) 
+ ' and Y pos ' + IntToStr(EventStrut.paramH); 
    
if EventStrut.message = WM_RBUTTONDOWN then 
      s :
= 'Right Mouse Down at X pos ' + 
        IntToStr(EventStrut.paramL) 
+ ' and Y pos ' + IntToStr(EventStrut.paramH); 
    
if (EventStrut.message = WM_RBUTTONUP) then 
      s :
= 'Right Mouse Up at X pos ' + 
        IntToStr(EventStrut.paramL) 
+ ' and Y pos ' + IntToStr(EventStrut.paramH); 
    
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); 
    
if s <> '' then 
       Form1.ListBox1.ItemIndex :
=  Form1.ListBox1.Items.Add(s); 
  end; 
end; 

procedure TForm1.Button_StartJourClick(Sender: TObject); 
begin 
  
if FHookStarted then 
  begin 
    ShowMessage(
'Mouse is already being Journaled, can not restart'); 
    Exit; 
  end; 
  JHook :
= SetWindowsHookEx(WH_JOURNALRECORD, @JournalProc, hInstance, 0); 
  {SetWindowsHookEx starts the Hook} 
  
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 
  {the journal hook 
is automaticly camceled if the Task manager 
  (Ctrl
-Alt-Del) or the Ctrl-Esc keys are pressed, you restart it 
  when the WM_CANCELJOURNAL 
is sent to the parent window, Application} 
  Handled :
= False; 
  
if (Msg.message = WM_CANCELJOURNAL) and FHookStarted then 
    JHook :
= SetWindowsHookEx(WH_JOURNALRECORD, @JournalProc, 00); 
end; 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
  {make sure you unhook it 
if the app closes} 
  
if FHookStarted then 
    UnhookWindowsHookEx(JHook); 
end; 

end. 





    本文转自 OldHawk  博客园博客,原文链接:http://www.cnblogs.com/taobataoma/archive/2007/08/20/862686.html,如需转载请自行联系原作者