• 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. 
  • 相关阅读:
    积水识别算法需求
    Visual detection and feature recognition of underwater target using a novel modelbased method
    A deep learning techniquebased automatic monitoring method for experimental urban road inundation
    Identification of Urban Road Waterlogging Using Floating Car Data
    android新手学习笔记
    转:Android编程获取手机型号,本机电话号码,sdk版本及firmware版本号(即系统版本号)
    Jquery getJSON() 序列化类以及集合(转)
    windows下eclipse模拟运行apk
    Android使用AttributeSet自定义控件的方法
    Android 支持多屏幕机制
  • 原文地址:https://www.cnblogs.com/taobataoma/p/862686.html
Copyright © 2020-2023  润新知