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

سؤال في vb6

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

السلام عليكم

هل ممكن عمل subclassعلي برنامج اخر غير فيجوال بيزك عن طريق فيجوال بيزك

بمعني اريد مراقبة احداث لوحة المفاتيح عندما يكون التركيز علي اداة كتابة في برنامج autocad ومعالجتها فبل ان تصل الي autocad

#2

السلام عليكم

نظرياً نعم

ضع في المويدول

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 Function WindowProc(ByVal hwnd As Long, _
                           ByVal uMsg As Long, _
                           ByVal wParam As Long, _
                           ByVal lParam As Long) As Long
                                                      
    WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)

End Function

في النافذة

ضع مقبض النافذة المراد مراقبتها في الوسيط الأول WinHnd

PrevProc = SetWindowLong(WinHnd , GWL_WNDPROC, AddressOf WindowProc)

لتحصل على مقبض النافذة ابحث عنها بواسطة اسمها كالتالي :

نعلن عن الوظيفة أولاً (في المديول) :

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
                        (ByVal lpClassName As String, _
                         ByVal lpWindowName As String) As Long

ثم نستدعي الوظيفة كالتالي (في النافذة) :

Dim WindowTitle As String

Dim WinHnd As Long 


WindowTitle = Text1.Text

WinHnd = FindWindow(vbNullString, WindowTitle)

وبهذا يكون المتغير WinHnd يحمل قيمة مقبض النافذة المرادة .

وبعد هذا يمكنك مراقبة رسائل لوحة المفاتيح طبعاً عن طريق دوال API الخاصة بلوحة المفاتيح .

والله أعلم

أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين

فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن

أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى

ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى

أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد

فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد

#3

هذه طريقة أخرى لإلتقاط ضربات لوحة المفاتيح ولكنها عامة لكل النوافذ

جرب أنقل التركيز لغير البرنامج المرفق و اضغط على لوحة المفاتيح ستجد أن النتيجة تظهر لك في البرنامج .

بالتوفيق

إلتقاط ضربات الكيبورد.rar

أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين

فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن

أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى

ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى

أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد

فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد

#4
MSVS كتب:
نظرياً نعم

بعد التجارب ،يبدو أن الفكرة :

PrevProc = SetWindowLong(WinHnd , GWL_WNDPROC, AddressOf WindowProc)

كانت خاطئة .

حيث أن الوسيط الأول يجب أن يحوي مقبض النافذة الحالية والتي يوجد بها الإجراء WindowProc

وعلى هذا فلو غيرت الوسيط الأول و وضعت عوضاً عنه مقبض النافذة التي تريد مراقبة رسائلها ستعود الدالة بالقيمة صفر :( أي أنها فشلت .

عموماً ،،

المثال المرفق في المشاركة السابقة يلتقط ضربات لوحة المفاتيح المرسلة لأي نافذة

على فكرة هل أنت موجود ؟ أم أني أحدث نفسي :D

تم تعديل هذه المشاركة بواسطة MSVS في 3 نوفمبر 2005 في 20:09

أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين

فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن

أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى

ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى

أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد

فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد

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

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