Πώς να ρυθμίσετε ένα Κλείσιμο των Windows στο Visual C# .NET

Για την Microsoft Visual Basic έκδοση αυτού του άρθρου, ανατρέξτε στην ενότητα 319524 .

Εισαγωγή

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

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

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

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

Για να ορίσετε μια του άγκιστρου ποντικιού και να παρακολουθείτε τα συμβάντα ποντικιού, ακολουθήστε τα εξής βήματα:

  1. Ξεκινήστε το Microsoft Visual Studio .NET.
  2. Στο μενού αρχείο , επιλέξτε Δημιουργίακαι, στη συνέχεια, κάντε κλικ στο έργο.
  3. Στο πλαίσιο διαλόγου " Νέο έργο ", κάντε κλικ στο κουμπί Visual C# έργα στην περιοχή Τύποι έργουκαι, στη συνέχεια, κάντε κλικ στο κουμπί Εφαρμογή των Windows στην περιοχή πρότυπα. Στο πλαίσιο όνομα , πληκτρολογήστε ThreadSpecificMouseHook. Από προεπιλογή, δημιουργείται μια φόρμα που ονομάζεται Form1.
  4. Προσθέστε την ακόλουθη γραμμή κώδικα στο αρχείο Form1.cs μετά από άλλες χρησιμοποιώντας προτάσεις.
    using System.Runtime.InteropServices;
  5. Προσθήκη μετά κώδικα στην κλάση Form1 .
    public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
    //Declare the hook handle as an int.
    static int hHook = 0;

    //Declare the mouse hook constant.
    //For other hook types, you can obtain these values from Winuser.h in the Microsoft SDK.
    public const int WH_MOUSE = 7;
    private System.Windows.Forms.Button button1;

    //Declare MouseHookProcedure as a HookProc type.
    HookProc MouseHookProcedure;

    //Declare the wrapper managed POINT class.
    [StructLayout(LayoutKind.Sequential)]
    public class POINT
    {
    public int x;
    public int y;
    }

    //Declare the wrapper managed MouseHookStruct class.
    [StructLayout(LayoutKind.Sequential)]
    public class MouseHookStruct
    {
    public POINT pt;
    public int hwnd;
    public int wHitTestCode;
    public int dwExtraInfo;
    }

    //This is the Import for the SetWindowsHookEx function.
    //Use this function to install a thread-specific hook.
    [DllImport("user32.dll",CharSet=CharSet.Auto,
    CallingConvention=CallingConvention.StdCall)]
    public static extern int SetWindowsHookEx(int idHook, HookProc lpfn,
    IntPtr hInstance, int threadId);

    //This is the Import for the UnhookWindowsHookEx function.
    //Call this function to uninstall the hook.
    [DllImport("user32.dll",CharSet=CharSet.Auto,
    CallingConvention=CallingConvention.StdCall)]
    public static extern bool UnhookWindowsHookEx(int idHook);

    //This is the Import for the CallNextHookEx function.
    //Use this function to pass the hook information to the next hook procedure in chain.
    [DllImport("user32.dll",CharSet=CharSet.Auto,
    CallingConvention=CallingConvention.StdCall)]
    public static extern int CallNextHookEx(int idHook, int nCode,
    IntPtr wParam, IntPtr lParam);
  6. Προσθέστε ένα στοιχείο ελέγχου κουμπιού στη φόρμα και, στη συνέχεια, προσθέστε τον ακόλουθο κώδικα στη διαδικασία Button1_click .
    private void button1_Click(object sender, System.EventArgs e){
    if(hHook == 0)
    {
    // Create an instance of HookProc.
    MouseHookProcedure = new HookProc(Form1.MouseHookProc);

    hHook = SetWindowsHookEx(WH_MOUSE,
    MouseHookProcedure,
    (IntPtr)0,
    AppDomain.GetCurrentThreadId());
    //If the SetWindowsHookEx function fails.
    if(hHook == 0 )
    {
    MessageBox.Show("SetWindowsHookEx Failed");
    return;
    }
    button1.Text = "UnHook Windows Hook";
    }
    else
    {
    bool ret = UnhookWindowsHookEx(hHook);
    //If the UnhookWindowsHookEx function fails.
    if(ret == false )
    {
    MessageBox.Show("UnhookWindowsHookEx Failed");
    return;
    }
    hHook = 0;
    button1.Text = "Set Windows Hook";
    this.Text = "Mouse Hook";
    }
    }
  7. Προσθέστε τον ακόλουθο κώδικα για τη συνάρτηση MouseHookProc στην κλάση Form1 .
    public static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam){
    //Marshall the data from the callback.
    MouseHookStruct MyMouseHookStruct = (MouseHookStruct) Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));

    if (nCode < 0)
    {
    return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
    else
    {
    //Create a string variable that shows the current mouse coordinates.
    String strCaption = "x = " +
    MyMouseHookStruct.pt.x.ToString("d") +
    " y = " +
    MyMouseHookStruct.pt.y.ToString("d");
    //You must get the active form because it is a static function.
    Form tempForm = Form.ActiveForm;

    //Set the caption of the form.
    tempForm.Text = strCaption;
    return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
    }
  8. Πατήστε F5 για να εκτελεστεί το έργο. Κάντε κλικ στο κουμπί της φόρμας για να ορίσετε το άγκιστρο. Οι συντεταγμένες ποντικιού εμφανίζεται στη γραμμή λεζάντα φόρμας όταν ο δείκτης μετακινείται στη φόρμα. Κάντε κλικ στο κουμπί ξανά για να καταργήσετε το άγκιστρο.

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

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

Διαδικασίες χαμηλού επιπέδου άγκιστρο ονομάζονται στο νήμα που εγκατέστησε το άγκιστρο. Άγκιστρα χαμηλού επιπέδου δεν απαιτούν ότι η διαδικασία του αγκίστρου υλοποιούνται σε ένα αρχείο DLL.

Αναφορές

Για περισσότερες πληροφορίες σχετικά με τα άγκιστρα, επισκεφθείτε την ακόλουθη τοποθεσία του Microsoft Developer Network (MSDN) στο Web:

Ιδιότητες

Αναγνωριστικό άρθρου: 318804 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια