كيفية تعيين موضع إضافة في الروتين Windows في Visual C#.NET

للحصول على إصدار Microsoft Visual Basic من هذه المقالة، راجع 319524 .

مقدمة

توضح هذه المقالة كيفية تعيين موضع إضافة في الروتين غير معينة لمؤشر ترابط وإجراء موضع الإضافة في الروتين باستخدام ربط الماوس كمثال. يمكنك استخدام خطافات لمراقبة أنواع معينة من الأحداث. يمكنك ربط هذه الأحداث مع مؤشر ترابط معين أو مع كافة مؤشرات الترابط في نفس سطح المكتب كمؤشر ترابط استدعاء.

مزيد من المعلومات

تعيين موضع إضافة في الروتين الماوس

لتعيين موضع إضافة في الروتين، استدعاء دالة SetWindowsHookEx من الملف User32.dll. تثبيت هذه الوظيفة إجراء موضع الإضافة في الروتين المعرفة من قبل التطبيق في سلسلة ربط المقترن بمأزق.

لتعيين موضع إضافة في الروتين ماوس ومراقبة أحداث الماوس، اتبع الخطوات التالية:

  1. Microsoft Visual Studio.NET.بدء تشغيل
  2. من القائمة ملف، أشر إلى جديد ثم انقر فوق المشروع.
  3. في مربع الحوار مشروع جديد ، انقر فوق مشاريع Visual C# ضمن أنواع المشاريع، ومن ثم انقر فوق تطبيق Windows ضمن قوالب. في المربع الاسم ، اكتب ثريدسبيسيفيكموسهوك. بشكل افتراضي، يتم إنشاء نموذج يسمى 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. أضف التعليمات البرمجية التالية للدالة موسيهوكبروك في فئة 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 (MSDN) التالي على الويب:

خصائص

رقم الموضوع: 318804 - آخر مراجعة: 19‏/01‏/2017 - المراجعة: 2

تعليقات