Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 17250|Απάντηση: 0

[Συμβουλές] Χρήση συναρτήσεων αγκίστρου σε δεξιότητες προγραμματισμού C# - SetWindowsHookEx

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 7/2/2019 9:12:59 μ.μ. | | |
Όπως γνωρίζετε: Η C# είναι μια συνοδευτική γλώσσα της πλατφόρμας .NET Framework και δεν είναι δυνατή η εφαρμογή καθολικών αγκίστρων με τις δικές της βιβλιοθήκες και διατάξεις μεταγλωττιστή. Ωστόσο, στην πράξη, οι κλήσεις σε μη διαχειριζόμενο κώδικα ισχύουν στη C#, χρησιμοποιώντας την ιδιότητα DllImport για την αναφορά μεθόδων στη βιβλιοθήκη μη διαχειριζόμενου κώδικα. Οι συναρτήσεις αγκίστρου υπάρχουν σε user32.dll και το πρωτότυπο της συνάρτησης είναι το εξής:

HHOOK WINAPI SetWindowsHookEx(

__in int idHook,

__in HOOKPROC lpfn,

__in HINSTANCE hMod,

__in DWORD dwThreadId);

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

Μπορούμε να αναφέρουμε αυτήν τη συνάρτηση σε C# δηλώνοντάς την ως εξής:

  [DllImport("user32.dll")]
        δημόσιο στατικό εξωτερικό int SetWindowsHookEx(
            Τύπος γάντζου idHook,
            HookProc lpfn,
            IntPtr hInstance,
            int threadId
            );

Αξίζει να αναφέρω ότι το HookType και το HookProc παραπάνω είναι οι προσαρμοσμένοι τύποι μου, κάτι που δεν είναι σημαντικό (επειδή το πρόγραμμα περνά μια διεύθυνση μνήμης κατά την εκτέλεση), αλλά πρέπει να πληροί ορισμένες προδιαγραφές.

Οι παράμετροι της συνάρτησης από πάνω προς τα κάτω είναι:

  idHook, ο οποίος αντιπροσωπεύεται εδώ από μια διαμορφωμένη απαρίθμηση
     Λειτουργία επανάκλησης LPFN όταν μπαίνουν στο παιχνίδι τα άγκιστρα
     Λαβή μονάδας hInstance της παρουσίας εφαρμογής (συνήθως η λαβή μονάδας της παρουσίας εφαρμογής όπου βρίσκεται η συνάρτηση επανάκλησης αγκίστρου)
       threadIdΤο αναγνωριστικό του νήματος που σχετίζεται με την εγκατεστημένη υπορουτίνα αγκίστρου

Υπάρχουν διάφοροι τύποι γάντζων:
Γενικά χρησιμοποιούμε το 13 για τον αποκλεισμό μηνυμάτων πληκτρολογίου και το 14 για τον αποκλεισμό μηνυμάτων ποντικιού.

Η δήλωση της συνάρτησης επανάκλησης Πρέπει να χρησιμοποιήσουμε αντιπροσώπους στη C# και η δήλωση είναι η εξής:
    δημόσιος εκπρόσωπος int HookProc(int nCode, int wParam, IntPtr lParam);

Η παράμετρος από πάνω προς τα κάτω σημαίνει ότι η παράμετρος που μεταβιβάζεται πίσω από την αλυσίδα αγκίστρου nCode, το 0 σημαίνει ότι αυτό το μήνυμα (από το προηγούμενο άγκιστρο μηνύματος) απορρίπτεται και το μη 0 σημαίνει ότι αυτό το μήνυμα συνεχίζει να είναι έγκυρο

Παράμετροι μηνύματος wParam

Παράμετρος μηνύματος lParam

Αξίζει να σημειωθεί ότι το wParam και το lParam είναι διαφορετικοί τύποι διαφορετικών τύπων μηνυμάτων, αλλά οι τύποι wParam μπορούν να αναπαρασταθούν χονδρικά με την ακόλουθη απαρίθμηση:
Το lParam γενικά ενθυλακώνεται ως δομή, η οποία ποικίλλει ανάλογα με τον τύπο του μηνύματος, οι ακόλουθες δύο δομές είναι η δομή lParam των μηνυμάτων ποντικιού και πληκτρολογίου:
Όταν κατανοήσουμε τις παραπάνω πληροφορίες, έχουμε μια βασική κατανόηση της υλοποίησης C# των συναρτήσεων αγκίστρου και, στη συνέχεια, δίνουμε προσοχή σε μερικές ερωτήσεις:

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

2. Για λόγους ευγένειας, το άγκιστρο θα πρέπει να επιστρέψει το αποτέλεσμα επεξεργασίας του επόμενου γάντζου, όχι μόνο το αποτέλεσμα επεξεργασίας του τρέχοντος γάντζου (χρησιμοποιήστε το CallNextHookEx για να καλέσετε το επόμενο άγκιστρο, καθώς το άγκιστρο έχει ρυθμιστεί πρώτα και μετά τίθεται σε ισχύ, επομένως θα πρέπει να γίνει για να διασφαλιστεί η κανονική παράδοση της αλυσίδας αγκίστρου).

3. Το hInstance στην παράμετρο συνάρτησης αγκίστρου είναι μόνο εκεί που βρίσκεται η συνάρτηση επανάκλησης του τρέχοντος γάντζου και πρέπει να δοθεί η σωστή διεύθυνση

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



Μπορείτε να κατεβάσετε το δείγμα προγράμματος που έγραψα, αλλά το πρόγραμμά μου χρειάζεται τα ακόλουθα κύρια σημεία:

1. Απέκλεισα την εφαρμογή των αγκίστρων και άνοιξα μόνο την υποκλοπή μηνυμάτων και την επεξεργασία του πληκτρολογίου και του ποντικιού (η μέθοδος χρήσης είναι η ίδια με τα συμβάντα ποντικιού και πληκτρολογίου WinForm της C#) και μπορείτε να ανοίξετε άλλα

2. Σχεδίασα το άγκιστρο να είναι σε λειτουργία singleton, μπορείτε να το ακυρώσετε

3. Λόγω κάποιας εισβολής στο λειτουργικό σύστημα, το λογισμικό προστασίας από ιούς μπορεί να αναφερθεί ως επικίνδυνο

4. Ο κώδικας είναι κακογραμμένος, απλά αρκεστείτε σε αυτόν......



Τέλος, η διαφορά μεταξύ της τεχνολογίας προγραμματισμού και της γλώσσας είναι ότι οι μεταγλωττιστές και οι χρήστες τους είναι διαφορετικοί, τα άτομα που χρησιμοποιούν C δεν μπορούμε να πούμε ότι είναι υψηλότερα από αυτά που χρησιμοποιούν Java και η τεχνολογία δεν αντικατοπτρίζεται απαραίτητα σε δείκτες, πίνακες, δομές δεδομένων, αρκεί άτομα που κατανοούν τις αρχές του υπολογιστή, τις αρχές μεταγλώττισης, τις αρχές του λειτουργικού συστήματος κ.λπ. Φυσικά, καλό είναι ο καθένας να έχει τη δική του αγαπημένη γλώσσα και τις συνήθεις μεθόδους προγραμματισμού.





Προηγούμενος:Εφαρμογή καθαρού γάντζου C#
Επόμενος:【Jiangshi WeChat Multi-Open】WeChat Scan Code Προαιρετική σύνδεση|Απεριόριστο Multi-Open|Αποθήκευση διαμόρφωσης σύνδεσης
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com