Κλείστε το ποντίκι για να πιάσετε εκδηλώσεις εκτός μιας εφαρμογής

Μάθετε πώς να παρακολουθείτε τη δραστηριότητα του ποντικιού ακόμα και όταν η εφαρμογή Delphi δεν είναι ενεργή, κάθεται στο δίσκος - σχάρα ή όχι δεν έχει κανένα περιβάλλον χρήστη καθόλου.

Εγκαθιστώντας ένα γάντζο ποντικιού σε όλο το σύστημα, μπορείτε να παρακολουθείτε τι κάνει ο χρήστης με το ποντίκι και να ενεργήσουν αναλόγως.

Τι είναι ένας γάντζος και πώς λειτουργεί;

Εν ολίγοις, ένας γάντζος είναι ένας (επανάκλησης) που μπορείτε να δημιουργήσετε ως μέρος ενός αρχείου DLL (βιβλιοθήκη δυναμικής σύνδεσης) ή την εφαρμογή σας για την παρακολούθηση των "εκδηλώσεων" στο εσωτερικό του λειτουργικού συστήματος των Windows.
Υπάρχουν 2 τύποι αγκίστρων - παγκόσμιοι και τοπικοί. Ένας τοπικός γάντζος παρακολουθεί τα πράγματα που συμβαίνουν μόνο για ένα συγκεκριμένο πρόγραμμα (ή νήμα). Ένα παγκόσμιο γάντζο παρακολουθεί ολόκληρο το σύστημα (όλα τα θέματα).

Για να δημιουργήσετε ένα παγκόσμιο γάντζο χρειάζεστε 2 έργα, 1 για να φτιάξετε το εκτελέσιμο αρχείο και 1 για να δημιουργήσετε ένα αρχείο DLL που περιέχει τη διαδικασία γάντζου.

instagram viewer

Το άρθρο μας που εργάζονται με άγκιστρα πληκτρολογίου από τους Δελφούς εξηγεί πώς να παρεμποδίζετε την είσοδο πληκτρολογίου για στοιχεία ελέγχου που δεν μπορούν να λάβουν την εστίαση εισόδου (όπως TImage).

Αγκίστρωση του ποντικιού

Με τη σχεδίαση, η κίνηση του ποντικιού περιορίζεται από το μέγεθος της οθόνης της επιφάνειας εργασίας σας (συμπεριλαμβανομένης της Γραμμής εργασιών των Windows). Όταν μετακινείτε το ποντίκι στην αριστερή / δεξιά / πάνω / κάτω άκρη, το ποντίκι θα σταματήσει - όπως αναμένεται (αν δεν έχετε περισσότερη από μία οθόνη).

Ακολουθεί μια ιδέα για το γάντζο ποντικιού σε όλο το σύστημα: Εάν, για παράδειγμα, θέλετε να μετακινήσετε το ποντίκι στη δεξιά πλευρά της οθόνης όταν μετακινείται προς την αριστερή άκρη (και "αγγίζει"), μπορείτε να γράψετε ένα παγκόσμιο γάντζο ποντικιού για να επανατοποθετήσετε το ποντίκι δείκτης.

Αρχίζετε δημιουργώντας ένα έργο βιβλιοθήκης δυναμικής σύνδεσης. Το αρχείο DLL πρέπει να εξάγει δύο μεθόδους: "HookMouse" και "UnHookMouse".

Η διαδικασία HookMouse καλεί το SetWindowsHookEx API που περάσει το "WH_MOUSE" για την πρώτη παράμετρο - εγκαθιστώντας έτσι μια διαδικασία αγκίστρου που παρακολουθεί τα μηνύματα του ποντικιού. Μία από τις παραμέτρους για το SetWindowsHookEx είναι η λειτουργία επανάκλησης των Windows Τα Windows θα σας καλέσουν όταν υπάρχει ένα μήνυμα του ποντικιού προς επεξεργασία:

SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0).

Η τελευταία παράμετρος (τιμή = 0) στο SetWindowsHookEx ορίζει ότι καταχωρούμε έναν παγκόσμιο γάντζο.

Το HookProc αναλύει τα μηνύματα που σχετίζονται με το ποντίκι και στέλνει ένα προσαρμοσμένο μήνυμα ("MouseHookMessage") στο δοκιμαστικό μας έργο:

λειτουργία HookProc (nCode: Ακέραιος αριθμός; MsgID: WParam; Δεδομένα: LParam): LResult; stdcall;

var

 mousePoint: TPoint;

 notifyTestForm: boolean;

 MouseDirection: TMouseDirection;

ξεκινήσει

 mousePoint: = PMouseHookStruct (Δεδομένα) ^. pt;


 notifyTestForm: = false;


αν (mousePoint. Χ = 0) έπειτα

ξεκινήσει

 Windows. SetCursorPos (-2 + οθόνη. Πλάτος, mousePoint.y);

 notifyTestForm: = true;

 MouseDirection: = mdRight;

τέλος;

...
αν notifyTestForm έπειτα

ξεκινήσει

 PostMessage (FindWindow ('TMainHookTestForm', μηδέν), MouseHookMessage, MsgID, ακέραιος (MouseDirection))?

τέλος;

Αποτέλεσμα: = CallNextHookEx (άγκιστρο, nCode, MsgID, δεδομένα);
τέλος;

Υπόδειξη: Διαβάστε τα αρχεία Βοήθειας SDK Win32 για να μάθετε για την εγγραφή PMouseHookStruct και την υπογραφή της λειτουργίας HookProc.

Σημείωση: Η λειτουργία αγκίστρου δεν χρειάζεται να στέλνει οτιδήποτε οπουδήποτε - η κλήση PostMessage χρησιμοποιείται μόνο για να υποδείξει ότι το αρχείο DLL μπορεί να επικοινωνεί με τον "εξωτερικό" κόσμο.

Ποντίκι γάντζου "Listener"

Το μήνυμα "MouseHookMessage" δημοσιεύτηκε στο δοκιμαστικό σας έργο - μια φόρμα που ονομάζεται "TMainHookTestForm". Θα αντικαταστήσετε τη μέθοδο WndProc για να λάβετε το μήνυμα και να ενεργήσετε όπως είναι απαραίτητο:

διαδικασία TMainHookTestForm. WndProc (var Μήνυμα: TMessage);

ξεκινήσει

κληρονόμησε WndProc (μήνυμα);

αν Μήνυμα. Msg = HookCommon. MouseHookMessage έπειτα

ξεκινήσει

// υλοποίηση στον συνοδευτικό κώδικα

 Σήμα (TMouseDirection (Μήνυμα. LParam)).

τέλος;

τέλος;

Φυσικά, όταν δημιουργείται η φόρμα (OnCreate) καλείτε τη διαδικασία HookMouse από το DLL, όταν κλείνει (OnDestroy) καλείτε τη διαδικασία UnHookMouse.

Σημείωση: Οι γάντζοι τείνουν να επιβραδύνουν το σύστημα επειδή αυξάνουν την ποσότητα επεξεργασίας που πρέπει να εκτελεί το σύστημα για κάθε μήνυμα. Θα πρέπει να εγκαταστήσετε ένα γάντζο μόνο όταν είναι απαραίτητο και να το αφαιρέσετε το συντομότερο δυνατόν.

instagram story viewer