Ловить события мышки вне вашего приложенияDelphi , ОС и Железо , Мышка и КурсорЛовить события мышки вне вашего приложения
Оформил: DeeCo 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; // The JournalRecordProc hook procedure is an application-defined or library-defined callback // function used with the SetWindowsHookEx function. // The function records messages the system removes from the system message queue. // A JournalRecordProc hook procedure does not need to live in a dynamic-link library. // A JournalRecordProc hook procedure can live in the application itself. // WH_JOURNALPLAYBACK Hook Function //Syntax // JournalPlaybackProc( // nCode: Integer; {a hook code} // wParam: WPARAM; {this parameter is not used} // lParam: LPARAM {a pointer to a TEventMsg structure} // ): LRESULT; {returns a wait time in clock ticks} 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. Программный код на Delphi, демонстрирующий установку хука для захвата событий мыши вне области приложения. Функция Процедуры Вот некоторые потенциальные улучшения:
Вот альтернативное решение с использованием встроенного компонента
В этом коде компонент Ловить события мышки вне вашего приложения: статья рассказывает о способе поймать события мыши в Windows, не используя традиционных окон и форм, а также предоставляет пример на Delphi. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Мышка и Курсор ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |