zoukankan      html  css  js  c++  java
  • 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, 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. 
  • 相关阅读:
    在vscode中显示空格和tab符号
    如何正确理解关键字"with"与上下文管理器
    HADOOP基本操作命令
    Ganglia环境搭建并监控Hadoop分布式集群
    关于分布式系统的数据一致性问题
    hadoop snapshot 备份恢复 .
    hadoop主节点(NameNode)备份策略以及恢复方法
    HDFS snapshot操作实战
    从 secondarynamenode 中恢复 namenode
    hadoop 通过distcp进行并行复制
  • 原文地址:https://www.cnblogs.com/taobataoma/p/862686.html
Copyright © 2011-2022 走看看