الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

أرجو الإجابة التحكم بالتطبيقات

مغلق
بدأه jarour في 14 مايو 2002 · 3 رد · 742 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

نعلم أن نظام ويندوز يقوم على مبدء الحدث وكل شيئ يتم عن طريق أرسال رسائل للنظام ومن ثم الإستجابة

مثلا رقم رسالة التعامل مع أزرار الفأرة 513-512........

والسؤال المطروح

هو كيف يمكن إعتراض هذة الرسائل وتعديلها بحيث البرنامج المستقبل يقوم بعمل ما نريدة

مثال

لنفرض تطبيق ماوهذا التطبيق كل فترة زمنية يقوم بإظهار فورم ماهي الوسيلة لإعتراض رسالة الإظهار وتغيرها

أنا لا أريد تغير محتوى الفورم ولكن لا أريد أن يظهر الفورم أرجو أن تكون الفكرة قد وضحت

#2

-

#3

عزيزي جرب اللينك بالاسفل وهو عبارة عن برامج تطبيقات الويندوز

اضغط هنا

والله ولي التوفيق

;)

#4

لكل نافذة إجراء خاص بها يستخدم لمعالجة جملة من رسائل النظام الموجهة إليها …. لكن قد تحتاج احيانا إلى معالجة رسالة غير معرفة ضمن الإجراء الذي يقوم بمعالجة الرسائل، أيضا قد تحتاج إلى اعتراض وصول رسائل النظام إلى النافذة وترغب بمعالجتها بطريقة أخرى ...

في هذه الحالة يمكننا استخدام طريقتين لإنجاز المهمة:

1. استخدام الدالة SetWindowsLong مع الكلمة المفتاحية AddressOf …. لكن يعيب هذه الطريقة - إلى جانب عدم موثوقيتها - أنها لاتعمل خارج مسار التنفيذ الحالي وبالتالي لا يمكن اصطياد الرسائل لتطبيق آخر. لاحظ المثال...

في وحدة نمطية:

Declare Function SetWindowLong Lib "user32" Alias _
 "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex _
 As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias _
 "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
 ByVal hwnd As Long, ByVal Msg As Long, ByVal _
 wParam As Long, ByVal lParam As Long) As Long

Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_MBUTTONDBLCLK = &H209
Public Const WM_MBUTTONDOWN = &H207
Public Const WM_MBUTTONUP = &H208
Public Const WM_MOUSEMOVE = &H200

Public Const GWL_WNDPROC = (-4)
Public lpPrevWndProc As Long
Public gHW As Long

Public Sub Hook()
   lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
   AddressOf WindowProc)
End Sub

Public Sub Unhook()
   Dim temp As Long
   temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
End Sub

Function WindowProc(ByVal hwnd As Long, ByVal uMsg As _
 Long, ByVal wParam As Long, ByVal lParam As Long) As _
 Long
   Select Case uMsg
     'النقر المزدوج بزر الفأرة الأيسر
     Case WM_LBUTTONDOWN
       Debug.Print "تم اعتراض ارسال رسالة النقر ";
       Debug.Print "بزر الفأرة الأيسر إلى النافذة"
       ' ......
     'Case WM_LBUTTONDBLCLK
       ' .....
     Case Else
     'معالجة بقية الرسائل بشكل طبيعي
     WindowProc = CallWindowProc(lpPrevWndProc, hwnd, _
       uMsg, wParam, lParam)
   End Select
End Function

في النموذج:

Private Sub Form_Load()
  gHW = Me.hwnd
  Hook
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Unhook
End Sub

لاحظت أن أسلوب win16 في مشاركة الإدخال مجدي لاعتراض الرسائل لنافذة خارج تطبيقك، لذا يمكنك استخدام الدالة AttachThreadInput لمشاركة مساري تنفيذ مختلفين..

2. الطريقة الثانية هي الأمثل ولا تشتمل على عيوب الأولى، وهي باستخدام مصنف فرعي كعنصر تحكم أو مكتبة ربط ديناميكية.

تستطيع استخدام العديد من المصنفات الفرعية المنتشرة على إنترنت، ويفضل ألا تكون معتمدة على فيجوال بيسك وذلك للمحافظة على موارد النظام ... و يمكنك إنشاء مصنفاتك الفرعية بنفسك، إذا كانت لديك بعض مبادئ استخدام مكتبات الربط الديناميكية في فيجوال بيسك.

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…