[ VB.NET ] شرح شامل عن SendMessage API & ListView Messages

تم تحميل الصفحة في 1,9581867 ثانية
شرح شامل عن SendMessage API & ListView Messages
إنضم
13 مارس 2013
المشاركات
2,820
الإعجابات
3,081
النقاط
113







السلام عليكم اعضاء وزوار المنتدى
سأشرح في هذا الموضوع عن طريقة التحكم في Listview الخاصة ببرنامج خارج برنامجنا عن طريق دوال API بالتحديد دالة SendMessage
قبل البدأ في الموضوع ، الشرح فقط تعليمي والله لا يسامح كل من استخدمه في الاختراق
ندخل الموضوع مباشرة :


قبل البدأ من الافضل تحميل مكتبة متكاملة في كل ما تحتاجه عن دوال API من شرحها و شرح برمتراتها ....

لتحميل المكتبة : Download
لاجهزة 64 بت حمل هذا الملف وضعه في مجلد الويندوز : Download

الآن للتحكم في أي نافذة يجب علينا جلب مقبضها (Handle)
ماهي النافذة ؟ النافذة هي اي عنصر موجودة في الفورم (نافذة ابن) او حتى الفورم نفسه (نافذة أب)
ماهو المقبض او الهاندل ؟ هو منفذ يممكننا من الوصول و التحكم في شيء معين في مثلنا نريد التحكم بنافذة وفي حالات اخرى التحكم في بروسس ....

الآن امامنا خياران اما ان نستخدم دالة FindWindowExA التي تجلب مقبض النافذة اذا مررت لها اسم كلاس النافذة او استعمال دالة GetDlgItem التي تجلب المقبض اذا مررت لها الـ ID الخاص بالنافذة ،
ملاحظة : في النافذة قد يكون هناك اكثر من كلاس بنفس الاسم على عكس الـ ID الذي يكون خاص بنافذة معينة واحدة ، تستطيع جلب الكلاس نيم او الـ ID من برنامج Spy ++
في الشرح راح استعمل دالة FindWindowExA نذهب الى المكتبة التي حملناها سابقا ونظغط على Index و نظغط على Display الآن امامك معلومات كاملة عن الدالة


البرمتر الأول hwndParent :
كما نرا في في التسمية التوضيحية hwndParent معناه مقبض النافذة الرئيسية (النافذة الأب) يمكن جلبها عن طريق دالة FindWindowA ، سيلي شرحها لاحقا

البرمتر الثاني : لا يهمنا
البرمتر الثالث lpszClass :
وهو اسم كلاس النافذة الابن كما قلت سابقا يمكن جلبه عن طريق برنامج Spy++
البرمتر الرابع lpszWindow :
وهو اسم النافذة يمكن استخدامه في حالة كان لدينا اكثر من نافذة لها نفس الكلاس نايم ويمكن تجاهله

والآن دالة FindWindowA التي قلنا انها تجلب مقبض النافذة الأب لنستكشف الدالة :


البرمتر الأول : اسم كلاس النافذة الأب يمكن الاستغناء عنه
البرمتر الثاني : اسم النافذة او عنوانها

تطبيق عملي : جلب مقبض نافذة listview الخاصة ببرنامج معين

كود Visual Basic
'ملاحظة : الكود هو تطبيق لاحد البرامج عندي يمكنك تبطيق الكود مع تغيير ما يجب على ما عندك من برامج
Public Class Form1
     Declare Function FindWindowA Lib "user32.dll" Alias "FindWindowA"   (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr   'Int32
    Declare Function FindWindowEx Lib "user32.dll" Alias   "FindWindowExA" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal   lpsz1 As String, ByVal lpsz2 As String) As Int32
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim ParentHWND As IntPtr = FindWindowA(Nothing, "Plugin Control") ' جلب مقبض نافذة الرئسية او النافذة الأب
         Dim ChildHWND = FindWindowEx(ParentHWND, Nothing,   "WindowsForms10.SysListView32.app.0.378734a", Nothing) 'جلب مقبض الليست   فيو عن طريق الكلاس نايم الخاص بها
        MsgBox(ChildHWND)
    End Sub
End Class





الآن لقد امتلكنا مقبض النافذة ويمكننا ارسال رسائل لها لذلك لنستعمل الدالة : SendMessageA



البرمتر الأول :
مقبض النافذة التي نريد ارسال امر لها (مقبض النافذة الابن الذي جلبناه سابقا)
البرمتر الثاني :
وهو الامر الذي تريد ارساله وهو عبارة عن قيمة عددية بصيغة Hex تعبر عن الرسالة ، قد اعطيت لهذه القيم اسماء عبر Const لتسهيل حفظها يمكنك اجادها هنا
http://pastebin.com/jybDuSGQ
البرمتر الثالث و الرابع :
ووهما اهم برمتران لهذه الدالة wParam & lParam يتغير دورهما بحسب الامر الذي سوف ترسله
و الدالة ترجع قيمة عددية تختلف حسب الأمر الذي أرسلته ايضا

الآن بما اننا نتعمال مع الـ Listview لنرا الأوامر الذي تخصنا و الشيء الذي يمكن ان يتغير في البرمتر
wParam & lParam في الدالة SendMessage و القيمة المرجعة لها
كل هذا نجده في موقع مايكرسوفت :
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

مثلا الآن نحن نريد جلب اندكس الخاص بـ item معينة في Listview ثم حذفها
نبحث في قليلا فنجد هذا الامر :
LVM_FINDITEM
ندخل له لنرا معلومات عليه لكن ما يهمنا هو
Parameters
وهي بالظبط البرمترات التي سندخلها في SendMessage

نلاحظ انه في WParam يطلب المكان الذي يبدأ منه البحث ستضع 1- لكي يبدأ من الأول
وفي LParam يتطلب ستركشر فيه مجموعة من المتغيرات لمعلومات عن الـ item الذي ستبحث عنه وهو ستركشر
LVFINDINFO لندخر الرابط الموجود في موقع ماكرسوفت و سترى الستركشر بالـ C++ مع معلومات عليه اسفله نترجم الستركشر الى VB.NET بمساوات المتغيرات :

كود Visual Basic
Private Structure LVFINDINFO
       Public flags As UInteger
       Public psz As String
       Public lParam As IntPtr
       Public pt As Point
       Public vkDirection As UInteger
   End Structure



الآن في الاسفل الصفحة سنجد مجموعة من المعلومات حول متغيرات هذا الستركشر

flags :
وهو طريقة البحث ، كما نعلم نحن نريد ان نبحث عن ال
ـ index الخاص بالـ item و نحن نعلم اسمها لذلك ما نريده هو LVFI_STRING وهو يمثل قيمة hex ايضا يمكن البحث في جوجل لتجد ان قيمته هي : &H2
تلاحظ في الشرح الخاص بميكرسوفت ان LVFI_STRING يتطلب ان تخزن في المتغير الثاني وهو psz اسم الـ Item الذي تريده

psz :
تضع فيه اسم الايتم كما قلنا
باقي المتغيرات لا نحتاجها فنضع قيمتها Nothing او 0

الآن بعد ان عرفنا Index الـ item يممكننا ارسال امر الحذف
نذهب مرة اخرى الى صفحة الاوامر في مايكروسوفت نبحث عن كونست لحذف الايتم لنجد اسمه LVM_DELETEITEM
نرى برامترات الامر مثل المرة السابقة :
في
wParam
يطلب الاندكس الخاصة بالايتم التي ستحذف
في
lParam
يجب تعيينها القيمة 0

تطبيق عملي : جلب الندكس الخاص بعنصر في ليست في باسم "IVDZ" ثم حذفه

كود Visual Basic
                 Imports System.Runtime.InteropServices
Public Class Form1
    ' الاعلام عن الثوابت
    Public Const LVM_FIRST = &H1000
    Public Const LVM_FINDITEM = (LVM_FIRST + 13)
    Public Const LVM_DELETEITEM = (LVM_FIRST + 8)
    'الاعلان عن ستركشر LVFINDINFO
    Structure LVFINDINFO
        Public flags As UInteger
        Public psz As String
        Public lParam As IntPtr
        Public pt As Point
        Public vkDirection As UInteger
    End Structure
    ' تعريف دالة SendMessageA
    Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
 
        Dim ListInfo As New LVFINDINFO ' تعريف متغير جديد من نوع ستركشر LVFINDINFO
        ListInfo.flags = &H2 ' تعين القيمة الاولى للستركشر : 2 ، وهي تعني LVFI_STRING
        ListInfo.psz = "IVDZ" ' تعيين قيمة المتغير الثاني العنصر الذي سنبحث عنه 
        'جلب عنوان الستركشر LVFINDINFO
        Dim address = Marshal.AllocHGlobal(Marshal.SizeOf(ListInfo)) '
        Marshal.StructureToPtr(ListInfo, address, True)
        ' ارسال امر الى الليست فيو خاصة ببرنامجنا وهذ الامر هو LVM_FINDITEM
        Dim index = SendMessage(ListView1.Handle, LVM_FINDITEM, -1, address)
        Threading.Thread.Sleep(500) ' تأخير البرنامج قليلا لكي لا يحدث مشاكل
        SendMessage(ListView1.Handle, LVM_DELETEITEM, index, Nothing) ' ارسال امر الحذف للليس فيو
    End Sub
End Class
         


ملاحظة هامة : كما تلاحظ انني لم ارسل امر جلب الاندكس و امر الحذف لبرنامج خارجي بل ارسلته لليست فيو داخل برنامج حيث جلبت مقبضها بالامر ListView1.handle لكن اذا حاولت ارسال امر LVM_FINDITEM الى مقبض ليست فيو جلبته عن طريق FindWindowEx مثل الجزء الاول من الموضوع سيحدث كراش للبرنامج ولن يعمل
لان الآن ما عليك ان تتعلم الدوال و آلية عملها اما في دروس قادمة ان شاء الله سوف اشرح كيفية ارسال امر LVM_FINDITEM الى نافذة خارجية وذلك بارسال الستركشر عن طريق دالة
VirtualAllocEx لانها موضوع متقدم قليلا ولن يكفي الموضوع لشرحه




اخيرا الموضوع من كتابتي من الصفر و من تعبي ، طلبي لكل شخص استفاد ان ينشر الموضوع على اوسع نطاق حتى ولو بنسخه ولصقه باي منتدى آخر ولا افرض عليك ذكر الحقوق لك الحرية التامة ، هدفي الوحيد هو اثراء المحتوى العربي

وأخيرا الاهداء :

U N C O D E R
Simon-Benyo
Native Call_
بيبرس شومن
JAAS
Z3r0n3
والى كل من تعلمت منه وافادني :30:

والسلام عليكم و رحمة الله تعالى وبركاته

 

CorrM

Just a Programmer
rankrankrankrankrankrank
إنضم
27 ديسمبر 2013
المشاركات
3,680
الإعجابات
7,022
النقاط
113
العمر
21
الإقامة
Egypt
رد: شرح شامل عن SendMessage API & ListView Messages

شرح رائع وافى و كافى عمل رائع

تستاهل التقيم و الخماسى

:42:
 
إنضم
25 أبريل 2012
المشاركات
3,113
الإعجابات
2,535
النقاط
113
الإقامة
.~JORDAN~.
رد: شرح شامل عن SendMessage API & ListView Messages

شرح رائع من شخص اروع ، بارك الله فيك اخوي :42:

SendMessage(ListView1.Handle, LVM_DELETEITEM, 2, Nothing) :222:
 

Đя.Aиσиyмσυs

.:: مُصمم جرافيكس، مَبرمج ::.
rankrankrank
إنضم
3 يونيو 2014
المشاركات
709
الإعجابات
964
النقاط
93
رد: شرح شامل عن SendMessage API & ListView Messages

*
وعليكم الســــلأام ورحمةة الله وبركاتةة
تسلم الايآدى استاذ /
IVDZ||Aymen Sekhri

ششرح مفصل ورائع لا تحرمنا جديدك .. !

:10:

 
إنضم
13 مارس 2013
المشاركات
2,820
الإعجابات
3,081
النقاط
113
رد: شرح شامل عن SendMessage API & ListView Messages

شكرا لمروركم جميعا :127:

شرح رائع من شخص اروع ، بارك الله فيك اخوي :42:

SendMessage(ListView1.Handle, LVM_DELETEITEM, 2, Nothing) :222:
معك حق خطأ مطبعي :30:
الرجاء من المشرف التعديل 2 الى index
 
إنضم
12 سبتمبر 2013
المشاركات
1,169
الإعجابات
1,307
النقاط
113
الإقامة
StartUp
شرح رائع من شخص رائع
تسلم أيدك حبيبى واصل إبداعك
تم دعمك بتقييم + Like + خمس نجوم
تحياتى إستمر​
 

CorrM

Just a Programmer
rankrankrankrankrankrank
إنضم
27 ديسمبر 2013
المشاركات
3,680
الإعجابات
7,022
النقاط
113
العمر
21
الإقامة
Egypt
إنضم
11 ديسمبر 2013
المشاركات
808
الإعجابات
874
النقاط
93
الإقامة
|[ Jordan ]|
رد: شرح شامل عن SendMessage API & ListView Messages

ما شاء الله اخي :yaho:

وأخيرا شخص مهتم بالـ API

اتمنى تكثر مواضيع حولها :637477:
 
إنضم
10 مارس 2011
المشاركات
9,125
الإعجابات
11,898
النقاط
113
الإقامة
Zaregoto
رد: شرح شامل عن SendMessage API & ListView Messages

شرح حلو و تفصيلات يستفيد منها المبتدأ و المحترف
يعطيك العافية يا غالي
:42:
 
إنضم
13 مارس 2013
المشاركات
693
الإعجابات
602
النقاط
93
الإقامة
Ntdll.dll
رد: شرح شامل عن SendMessage API & ListView Messages

بارك الله فيك حبيبي ... و الله موضوع مميز و فريد ,, حتى إني كنت أريد فهم دوال ال API و قد استفدت كثيرا من شرحك شكرا و ألف شكر لك :42:
تستاهل أحلى تقييم + دعاء الخير :637477:
واصل بمثل هذه المواضيع حبيبي :10:
 

ألـحـكـومـة

‫༺༼ ألہٰحہٰكہٰومہٰة ༽༻‬‎‏
rankrankrankrankrank
إنضم
6 أبريل 2013
المشاركات
2,518
الإعجابات
2,108
النقاط
113
الإقامة
IRAK
رد: شرح شامل عن SendMessage API & ListView Messages

بارك الله بيك يا غالي شرح جميل

تم تقيمك يا بطل :yaho:
 
إنضم
31 مارس 2013
المشاركات
2,138
الإعجابات
1,919
النقاط
113
الإقامة
IRaQ
رد: شرح شامل عن SendMessage API & ListView Messages

شرح رائع قبل فترة كنت اطلع على نفس الموضع
كان حول جلب متغير من الاست فيو في برنامج اخر
كان التعامل عن طريق جلب المتغير من الذاكرة .
 
إنضم
11 ديسمبر 2013
المشاركات
808
الإعجابات
874
النقاط
93
الإقامة
|[ Jordan ]|
رد: شرح شامل عن SendMessage API & ListView Messages

للفائدة :

ما الفرق بين SendMessage و PostMessage ?؟

وكذلك الفرق بين SendMessage و SendMessageA و SendMessageW :yaho:

:222::222::222:
 
إنضم
31 مارس 2013
المشاركات
2,138
الإعجابات
1,919
النقاط
113
الإقامة
IRaQ
رد: شرح شامل عن SendMessage API & ListView Messages

للفائدة :

ما الفرق بين SendMessage و PostMessage ?؟

وكذلك الفرق بين SendMessage و SendMessageA و SendMessageW :yaho:

:222::222::222:
حسب الي اعرفة :

SendMessageA for Ansi

SendMessageW for Unicode
 
إنضم
13 مارس 2013
المشاركات
2,820
الإعجابات
3,081
النقاط
113
رد: شرح شامل عن SendMessage API & ListView Messages

للفائدة :

ما الفرق بين SendMessage و PostMessage ?؟

وكذلك الفرق بين SendMessage و SendMessageA و SendMessageW :yaho:

:222::222::222:
PostMessage لم استعملها من قبل :15:
+
الكثير من الدوال و الستركشرات فيها 3 نسخ
و الرمز A : ترمز الى Ansi و هو نوع من السترينغ بحجم 1 بايت لكل حرف
وفيه 256 حرف وهذا جدول الذي يرمز الى تلك الحروف
http://4toc.com/fb/FBHelp/gfx/AppF_ASCIITable.png
كلما ترا كلها حروف انجليزية و فرنسية فقط
اما W : يرمز الى Wide او Unicode وهو سترينغ ايضا حجم كل حرف 2 بايت
فيه 1,112,114 (حسب جوجل) حرف من كل اللغات
http://unicode-table.com/en/
وبذلك اي دالة تتعامل مع النصوص لديه 3 نسخ منها
 
إنضم
11 ديسمبر 2013
المشاركات
808
الإعجابات
874
النقاط
93
الإقامة
|[ Jordan ]|
رد: شرح شامل عن SendMessage API & ListView Messages

حسب الي اعرفة :

SendMessageA for Ansi

SendMessageW for Unicode
PostMessage لم استعملها من قبل
+
الكثير من الدوال و الستركشرات فيها 3 نسخ
و الرمز A : ترمز الى Ansi و هو نوع من السترينغ بحجم 1 بايت لكل حرف
وفيه 256 حرف وهذا جدول الذي يرمز الى تلك الحروف
http://4toc.com/fb/FBHelp/gfx/AppF_ASCIITable.png
كلما ترا كلها حروف انجليزية و فرنسية فقط
اما W : يرمز الى Wide او Unicode وهو سترينغ ايضا حجم كل حرف 2 بايت
فيه 1,112,114 (حسب جوجل) حرف من كل اللغات
http://unicode-table.com/en/
وبذلك اي دالة تتعامل مع النصوص لديه 3 نسخ منها
Great :2 (64):
 

الأعضاء النشطين حاليآ الذين يشاهدون هذا الموضوع (1 عضو و 0 ضيف)

خيارات الاستايل

نوع الخط
مودك
اخفاء السايدر بار OFF
توسيط المنتدى OFF
فصل الأقسام OFF
الأقسام الفرعية OFF
عرض المشاركات
حجم الخط
معلومات العضو OFF
إخفاء التوقيع OFF

إرجاع خيارات الإستايل