博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Trap mouse events outside of my application
阅读量:6083 次
发布时间:2019-06-20

本文共 3568 字,大约阅读时间需要 11 分钟。

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,如需转载请自行联系原作者

你可能感兴趣的文章
【重构与模式】6.3 用Factory封装类
查看>>
Go语言interface详解
查看>>
ASP实现自动解析网页中的图片地址
查看>>
一个基于CSS3的网站
查看>>
策划了个.NET控件的案例大赛
查看>>
jdk安装配置环境变量
查看>>
Spring Batch JobExecutionDecider
查看>>
java守护线程的理解
查看>>
关于模版模式
查看>>
偶尔看到的c11新特性2
查看>>
控制并发访问资源 -- Semaphore
查看>>
for循环的简单例子:求100以内的偶数和
查看>>
真正聪明的人都是下笨功夫(深度好文)
查看>>
facebook160亿美元收购WhatsApp
查看>>
Python 05 自定义函数的创建、调用和函数
查看>>
千方百计获取百度网盘下载链接
查看>>
淘宝网页变为繁体,教你如何改回简体
查看>>
网页选项卡
查看>>
数据库的备份与恢复 mysqldump+binlog方式
查看>>
SAMBA服务器的配置
查看>>