السلام عليكم
هل ممكن عمل subclassعلي برنامج اخر غير فيجوال بيزك عن طريق فيجوال بيزك
بمعني اريد مراقبة احداث لوحة المفاتيح عندما يكون التركيز علي اداة كتابة في برنامج autocad ومعالجتها فبل ان تصل الي autocad
السلام عليكم
هل ممكن عمل subclassعلي برنامج اخر غير فيجوال بيزك عن طريق فيجوال بيزك
بمعني اريد مراقبة احداث لوحة المفاتيح عندما يكون التركيز علي اداة كتابة في برنامج autocad ومعالجتها فبل ان تصل الي autocad
السلام عليكم
نظرياً نعم
ضع في المويدول
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 الخاصة بلوحة المفاتيح .
والله أعلم
أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين
فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن
أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى
ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى
أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد
فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد
هذه طريقة أخرى لإلتقاط ضربات لوحة المفاتيح ولكنها عامة لكل النوافذ
جرب أنقل التركيز لغير البرنامج المرفق و اضغط على لوحة المفاتيح ستجد أن النتيجة تظهر لك في البرنامج .
بالتوفيق
أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين
فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن
أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى
ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى
أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد
فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد
MSVS كتب:نظرياً نعم
بعد التجارب ،يبدو أن الفكرة :
PrevProc = SetWindowLong(WinHnd , GWL_WNDPROC, AddressOf WindowProc)
كانت خاطئة .
حيث أن الوسيط الأول يجب أن يحوي مقبض النافذة الحالية والتي يوجد بها الإجراء WindowProc
وعلى هذا فلو غيرت الوسيط الأول و وضعت عوضاً عنه مقبض النافذة التي تريد مراقبة رسائلها ستعود الدالة بالقيمة صفر :( أي أنها فشلت .
عموماً ،،
المثال المرفق في المشاركة السابقة يلتقط ضربات لوحة المفاتيح المرسلة لأي نافذة
على فكرة هل أنت موجود ؟ أم أني أحدث نفسي :D
تم تعديل هذه المشاركة بواسطة MSVS في 3 نوفمبر 2005 في 20:09
أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين
فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن
أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى
ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى
أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد
فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد
هذا الموضوع مغلق.