Αναγν. άρθρου: 319524 - Τελευταία αναθεώρηση: Δευτέρα, 19 Ιουλίου 2010 - Αναθεώρηση: 1.0

Με τον τρόπο ορισμού ενός άγκιστρο σε Visual Basic.NET

Συμβουλή συστήματοςΑυτό το άρθρο ισχύει για διαφορετικό λειτουργικό σύστημα από αυτό που χρησιμοποιείτε. Το περιεχόμενο του άρθρου που ενδέχεται να μην σας αφορά έχει απενεργοποιηθεί.
Για ένα Microsoft Visual C# έκδοση αυτού του άρθρου, ανατρέξτε στην ενότητα318804  (http://support.microsoft.com/kb/318804/ ) .

Σε αυτήν τη σελίδα

Ανάπτυξη όλων | Σύμπτυξη όλων

Περίληψη

Αυτό το άρθρο περιγράφει τον τρόπο ορισμού ενός άγκιστρο που ανταποκρίνεται σε ένα νήμα και σε μια διαδικασία αγκίστρου. Αυτό το άρθρο χρησιμοποιεί το άγκιστρο ποντίκι ως παράδειγμα.

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

Περισσότερες πληροφορίες

Ορίστε μια του άγκιστρου ποντικιού

Για να ορίσετε ένα άγκιστρο, καλέστε τοSetWindowsHookExλειτουργία από το αρχείο User32.dll. Η συνάρτηση αυτή εγκαθιστά μια διαδικασία αγκίστρου που ορίζεται από την εφαρμογή της αλληλουχίας άγκιστρο που σχετίζεται με το άγκιστρο.

Για να ορίσετε μια του άγκιστρου ποντικιού και να παρακολουθείτε τα συμβάντα ποντικιού, ακολουθήστε τα εξής βήματα:
  1. Ξεκινήστε το Microsoft Visual Studio .NET.
  2. Από τοΤο αρχείομενού, σημείοΝέα, και στη συνέχεια κάντε κλικ στην επιλογήΤο έργο.
  3. Με τοΝέο έργοπαράθυρο διαλόγου, κάντε κλικ στο κουμπίΈργα της Visual Basicστην περιοχήΤύποι έργου. Στη συνέχεια, κάντε κλικ στην επιλογήΕφαρμογή των Windowsστην περιοχήΠρότυπα.
  4. Με τοΌνομαπλαίσιο, πληκτρολογήστεThreadSpecificMouseHook. Από προεπιλογή, δημιουργείται μια φόρμα που ονομάζεται "Φόρμα1.
  5. Στην αρχή του αρχείου Form1.vb, επικολλήστε τον παρακάτω κώδικα.
    Imports System.Runtime.InteropServices
    Public Delegate Function CallBack( _
        ByVal nCode As Integer, _
        ByVal wParam As IntPtr, _
        ByVal lParam As IntPtr) As Integer
  6. Με τοΦόρμα1η κλάση, επικολλήστε τον παρακάτω κώδικα.
    'Declare the mouse hook constant.
    'For other hook types, obtain these values from Winuser.h in Microsoft SDK.
        Dim WH_MOUSE As Integer = 7
        Shared hHook As Integer = 0
    
        'Keep the reference so that the delegate is not garbage collected.
        Private hookproc As CallBack
    
        'Import for the SetWindowsHookEx function.
        <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
         Public Overloads Shared Function SetWindowsHookEx _
              (ByVal idHook As Integer, ByVal HookProc As CallBack, _
               ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer
        End Function
    
        'Import for the CallNextHookEx function.
        <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
         Public Overloads Shared Function CallNextHookEx _
              (ByVal idHook As Integer, ByVal nCode As Integer, _
               ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
        End Function
        'Import for the UnhookWindowsHookEx function.
        <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
             Public Overloads Shared Function UnhookWindowsHookEx _
                  (ByVal idHook As Integer) As Boolean
        End Function
    
        'Point structure declaration.
        <StructLayout(LayoutKind.Sequential)> Public Structure Point
            Public x As Integer
            Public y As Integer
        End Structure
    
        'MouseHookStruct structure declaration.
        <StructLayout(LayoutKind.Sequential)> Public Structure MouseHookStruct
            Public pt As Point
            Public hwnd As Integer
            Public wHitTestCode As Integer
            Public dwExtraInfo As Integer
        End Structure
  7. Προσθήκη ενός κουμπιού στη φόρμα . Στη συνέχεια, επικολλήστε τον ακόλουθο κώδικα στο τοbutton1_clickη διαδικασία.
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            If hHook.Equals(0) Then
                hookproc = AddressOf MouseHookProc
                hHook = SetWindowsHookEx(WH_MOUSE, _
                                         hookproc, _
                                         IntPtr.Zero, _
    AppDomain.CurrentDomain.GetCurrentThreadId())
                If hHook.Equals(0) Then
                    MsgBox("SetWindowsHookEx Failed")
                    Return
                Else
                    Button1.Text = "UnHook Windows Hook"
                End If
            Else
                Dim ret As Boolean = UnhookWindowsHookEx(hHook)
    
                If ret.Equals(False) Then
                    MsgBox("UnhookWindowsHookEx Failed")
                    Return
                Else
                    hHook = 0
                    Button1.Text = "Set Windows Hook"
                    Me.Text = "Mouse Hook"
                End If
            End If
    
        End Sub
  8. Με τοΦόρμα1κλάσης, επικολλήστε τον ακόλουθο κώδικα για τοMouseHookProcσυνάρτηση.
        Public Shared Function MouseHookProc( _
        ByVal nCode As Integer, _
        ByVal wParam As IntPtr, _
        ByVal lParam As IntPtr) As Integer
    Dim MyMouseHookStruct As New MouseHookStruct()
    
            Dim ret As Integer
    
            If (nCode < 0) Then
                Return CallNextHookEx(hHook, nCode, wParam, lParam)
            End If
    
            MyMouseHookStruct = CType(Marshal.PtrToStructure(lParam, MyMouseHookStruct.GetType()), MouseHookStruct)
    
            Dim tempForm As Form
            tempForm = Form.ActiveForm()
    
            Dim strCaption As String
            strCaption = "x = " & MyMouseHookStruct.pt.x & " y = " & MyMouseHookStruct.pt.y
    
            tempForm.Text = strCaption
            Return CallNextHookEx(hHook, nCode, wParam, lParam)
    
        End Function
  9. Πατήστε F5 για να εκτελέσετε το έργο . Κάντε κλικ στο κουμπί της φόρμας για να ορίσετε το άγκιστρο. Τις συντεταγμένες του δείκτη που εμφανίζεται στη γραμμή λεζάντα φόρμας όταν ο δείκτης του ποντικιού μετακινείται στη φόρμα.
  10. Κάντε κλικ στο κουμπί ξανά για να καταργήσετε το άγκιστρο.

Καθολική άγκιστρα δεν υποστηρίζονται στο .NET Framework

Δεν είναι δυνατό να εφαρμόζετε καθολικά άγκιστρα στο .NET Framework. Άγκιστρα χαμηλού επιπέδου εκτελείται στη διεργασία του καλούντος. Αυτά τα άγκιστρα δεν απαιτούν ότι έχει εισαχθεί κωδικός σε άλλες διεργασίες. Μπορεί να υλοποιηθεί σε διαχειριζόμενο κώδικα, αλλά μπορεί να μην συνεχίσετε την εργασία σας. Επειδή κάθε συμβάν εισόδου πρέπει να περιμένει για το άγκιστρο χαμηλού επιπέδου για την επιστροφή πριν από την αποστολή του το άγκιστρο, αργή άγκιστρα μπορεί να παρεμποδίσει σημαντικά την ανταπόκριση του συστήματος. Τα Windows σιωπηρά καταργεί τυχόν άγκιστρο που απαιτεί πολύ χρόνο για την επεξεργασία. Επειδή ο διαχειριζόμενος κώδικας δεν μπορεί να ελέγξει ποια ώρα θα εκτελείται η συλλογή απορριφθέντων στοιχείων, δεν υπάρχει καμία εγγύηση ότι η διαδικασία αγκίστρου θα επιστρέφει πάντα αρκετά γρήγορα ώστε να αποφύγετε την κατάργηση.

Αναφορές

Για περισσότερες πληροφορίες σχετικά με τα άγκιστρα, επισκεφθείτε την ακόλουθη τοποθεσία Web Microsoft Developer Network (MSDN):
http://MSDN.Microsoft.com/en-us/library/ms644959.aspx (http://msdn.microsoft.com/en-us/library/ms644959.aspx)

Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Λέξεις-κλειδιά: 
kbhowtomaster kbmt KB319524 KbMtel
Μηχανικά μεταφρασμένοΜηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:319524  (http://support.microsoft.com/kb/319524/en-us/ )