分享

How to catch "MOUSE CLICK" in any place on screen ( OUT or IN form application)

 和谐世界 2023-10-13 发布于福建
How to catch "MOUSE CLICK" in any place on screen ( OUT or IN form application)


Delphi:
type
  TForm1 = class(TForm)
    Label2: TLabel;
    Label1: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

(*
  WM_MOUSEFIRST       = $0200; 512
  WM_MOUSEMOVE        = $0200;
  WM_LBUTTONDOWN      = $0201; 513
  WM_LBUTTONUP        = $0202; 514
  WM_LBUTTONDBLCLK    = $0203; 515
  WM_RBUTTONDOWN      = $0204; 516
  WM_RBUTTONUP        = $0205; 517
  WM_RBUTTONDBLCLK    = $0206; 518
  WM_MBUTTONDOWN      = $0207; 519
  WM_MBUTTONUP        = $0208; 520
  WM_MBUTTONDBLCLK    = $0209; 521
  WM_MOUSEWHEEL       = $020A; 522

  HC_ACTION = 0;
*)
var
  FHookHandle: HHOOK;

function MyMouseClick(AwParam: wParam): string;
begin
  case AwParam of
    WM_MOUSEMOVE:
      result := '(Mouse Moving action)';
    WM_LBUTTONDOWN:
      result := '(Left Button Down)';
    WM_LBUTTONUP:
      result := '(Left Button Up)';
    WM_LBUTTONDBLCLK:
      result := '(Left Button Double-click)';
    WM_RBUTTONDOWN:
      result := '(Right Button Down)';
    WM_RBUTTONUP:
      result := '(Right Button Up)';
    WM_RBUTTONDBLCLK:
      result := '(Right Button Double-click)';
    WM_MBUTTONDOWN:
      result := '(Middle Button Down)';
    WM_MBUTTONUP:
      result := '(Middle Button Up)';
    WM_MBUTTONDBLCLK:
      result := '(Middle Button Double-click)';
    WM_MOUSEWHEEL:
      result := '(Mouse Wheel action)';
  else
    result := 'Others...';
  end;
end;

function MouseHookProc(nCode: integer; wParam: wParam; lParam: lParam): LRESULT; stdcall;
begin
  Form1.Label2.Caption := 'Time: ' + TimeToStr(Now);
  Form1.Label3.Caption := 'HC_ACTION = ' + HC_ACTION.ToString;
  Form1.Label4.Caption := 'nCode = ' + nCode.ToString;
  Form1.Label5.Caption := 'wParam = ' + wParam.ToString + ' ' + MyMouseClick(wParam);
  //
  if (HC_ACTION = 0) then
    begin
      case wParam of
        WM_LBUTTONDOWN:
          begin
          Form1.Label1.Caption := 'Mouse Left Clicked';
          end;
        WM_RBUTTONDOWN:
          begin
          Form1.Label1.Caption := 'Mouse Right Clicked';
          end;
      end;
    end;
  //
  result := CallNextHookEx(FHookHandle, nCode, wParam, lParam); // next process...
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // installing the "hook"
  FHookHandle := SetWindowsHookEx(WH_MOUSE_LL, @MouseHookProc, HInstance, 0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // removing the "hook" - DONT FORGET!
  UnhookWindowsHookEx(FHookHandle);
end;

initialization

ReportMemoryLeaksOnShutdown   := true;
FormatSettings.LongTimeFormat := 'hh:nn:ss.zzz';

end.
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3    

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多