Trap mouse events outside of my application

简介:
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,  0 0 ); 
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,如需转载请自行联系原作者


相关文章
|
JavaScript
Event Bus
本文主要通过简单的实例学习了Vue中有关于 EventBus 相关的知识点。主要涉及了 EventBus 如何实例化,又是如何通过 $emit` 发送频道信号,又是如何通过 `$on 来接收频道信号。最后简单介绍了如何创建全局的 EventBus 。从实例中我们可以了解到, EventBus 可以较好的实现兄弟组件之间的数据通讯。
69 2
|
内存技术
Egret的TimerEvent.TIMER和Event.ENTER_FRAME的区别
Egret的TimerEvent.TIMER和Event.ENTER_FRAME的区别
73 0
|
Java Spring
Redisson BUG: Failed to submit a listener notification task. Event loop shut down?
Redisson BUG: Failed to submit a listener notification task. Event loop shut down?
1392 0
Error starting ApplicationContext. To display the conditions report re-run your application with
Error starting ApplicationContext. To display the conditions report re-run your application with
1031 0
Error starting ApplicationContext. To display the conditions report re-run your application with
一零五、Error starting ApplicationContext. To display the conditions report re-run your application with
一零五、Error starting ApplicationContext. To display the conditions report re-run your application with
一零五、Error starting ApplicationContext. To display the conditions report re-run your application with
|
开发者
Dynamic function tracing events
本文翻译自LWN文章“Dynamic function tracing events”,原文[链接](https://lwn.net/Articles/747256/) 从内核引入tracepoint开始,开发者们就对这些tracepoint是否为内核ABI的一部分而发生过争执。过去由于破坏了已有存在依赖的用户态程序,tracepoint相关变更被回退过。同时,对内部代码无法改变的恐慌使得在
1145 0
|
JavaScript 前端开发