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

دالة Sendmessage ب64 Overload جاهزة للعمل فى الدوت نت

بدأه _- محمد نور -_ في 1 يناير 2010 · 14 رد · 1,415 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

هذا الموضوع سوف أنقله إلى قسم السى شارب بعد كتابته و لكن أحببت أن يكون له وصله هنا لكون طبيعته تتحدث عن قاسم مشترك بين القسمين

فى المرفقات كلاس كتبتها بالدوت نت قمت فيها بعمل wrapping للSendMessage

تجدوا به SendMessage بحوالى 64 overload مع كافة الثوابت و الstructs التى قد تحتاجها لكى ترسل رسالة

أصل هذه الكلاس موجود فى إطار العمل نفسه فى الدون نت

و لكنها كلاس internal أى أن الأصل فيها ليس للمطورين و لكن لعمل الFramework الداخلى فقط !

عموما هى حوالى 1600 سطر مقسمة كالأتى

جزء خاص الSendMessage

جزء خاص الstructs

و الجزء الأخير الخاص بالثوابت

SendMessage32.rar

3

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#2

فكرة جميلة اخ محمد، و لكن هل فكرت فى تضمينها بإستخدام الـ Generics ستوفر الكثير من الكود.

مجهود جميل.

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

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 2 يناير 2010 في 07:54

مدونتي: C++ Tips and Tricks

#3

هذه كانت الإصدارة الأولى !

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

ماذا تقصد بتضمين الGenerics !

يوجد أكثر من 1000 دالة Native API بداخل إطار العمل بالإضافة إلى الStructs المطلوبة و الثوابت أيضا :wub:

لوأستطعت أن أستخلصهم لنفسى :lol:

ربما بعدها أبنى إطار عمل خاص بى وحدى :cool:

ربما لو قمنا بعمل فريق لفعل هذا

سوف تصبح لدينا مكتبة جبارة للWrapping

عندك مثلا فى الSystem.Windows.Forms

توجد كافة دوال الNative Controls

فى Microsoft.Win32

توجد دوال التعامل مع المؤشرات و أشياء أخرى كثرة جدا

طبعا الكثير الكثير منها موجود بالفعل فى إطار العمل و لكن إيضا الكثير الكثير غير موجود :D

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#4

محمد علاء يقصد استخدام فضاء الاسماء بالشكل التالى

using System.Collections.Generic;

للتغلب على مشكلة ال Data Type Safety و التحويل بين انواع البيانات المختلفة بشكل مختصر

2

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#5

مشكور أخونى الكريم على هذه المشاركة ولكن نحتاج لمثال يبين كيفة إستعمالها

#6
اقتباس
ماذا تقصد بتضمين الGenerics !

حيث ان المعاملين lParam و wParam هم دائمى التغيير يمكننا صنع داله واحده Generic و تستقبل نوعين يتم ايدالهم من داخل الداله، اعتقد نظره للكود ستكون اوضح كثيرا

Imports System.Runtime.InteropServices

    Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
    (ByVal hWnd As IntPtr, ByVal wMsg As UInteger, ByVal wParam As IntPtr, _
     ByVal lParam As IntPtr) As Integer

    Public Function SendMessage(Of T1, T2)(ByVal Handle As IntPtr, ByVal Message As UInteger, _
                                           ByVal wParam As T1, ByVal lParam As T2) As Integer

        Dim wParamGC As GCHandle = GCHandle.Alloc(wParam, GCHandleType.Pinned)
        Dim lParamGC As GCHandle = GCHandle.Alloc(lParam, GCHandleType.Pinned)

        Dim ret As Integer = SendMessage(Handle, Message, _
                                         wParamGC.AddrOfPinnedObject, _
                                         lParamGC.AddrOfPinnedObject)

        wParamGC.Free()
        lParamGC.Free()

        Return ret
    End Function

الأن يمكنك ان تمرر اى كائن من اى نوع للداله SendMessage (المعدله) و ستقوم هى بما يجب و لا داعى من وجود العديد من الـ Overloads. :)

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

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 5 يناير 2010 في 13:53

2

مدونتي: C++ Tips and Tricks

#7

واحدة +1 من عندى يابو علاء :wink:

وواحدة لطارق وسلام كبير أوى للمعلم نور :blush:

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#8

ممكن أحد يترجم كود الفى بى إلى سى شارب لكونى حاليا لا معرفتى بالفى بى ضعيفة قليلا :mellow:

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#9
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;

class test
{
	[DllImport("user32.dll", EntryPoint = "SendMessageA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
	private static extern int SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, IntPtr lParam);

	public int SendMessage<T1, T2>(IntPtr Handle, uint Message, T1 wParam, T2 lParam)
	{

		GCHandle wParamGC = GCHandle.Alloc(wParam, GCHandleType.Pinned);
		GCHandle lParamGC = GCHandle.Alloc(lParam, GCHandleType.Pinned);

		int ret = SendMessage(Handle, Message, wParamGC.AddrOfPinnedObject(), lParamGC.AddrOfPinnedObject());

		wParamGC.Free();
		lParamGC.Free();

		return ret;
	}
}

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#10

ربنا يبارك لك يبنى ولا يحوجك لبتوع الفى بى أبدا :P

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#11

جزاك الله خيرا أخ محمد علاء الدين

نفعنى هذا الأمر بالفعل

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#12

ملحوظة صغيرة

كتابة الدالة بهذا الأسلوب يؤدى إلى مشاكل أثناء نقل المتغير من الmanaged إلى الunmanaged

و هذا يؤدىإلى مشاكل أثناء عمل البرنامج

فى البرنامج الذى أكتبه لقراءة بيانات من أداة فى برنامج أخر أستخدم الرسائل بكثرة

قمت بتطبيق الأسلوب الذى أوضحته و لكن البرنامج الموجة له الرسالة ينهار و يغلق

فلما عدت للأسلوب العادى كل شئ عمل كما كان

أظن أن هذا الأسلوب لا يصلح مع الunmanaged types

لو أنك قابلتك مشكلة مثل هذه فلتقل لنا عنها

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#13
_- محمد نور -_ كتب:

ملحوظة صغيرة

كتابة الدالة بهذا الأسلوب يؤدى إلى مشاكل أثناء نقل المتغير من الmanaged إلى الunmanaged

و هذا يؤدىإلى مشاكل أثناء عمل البرنامج

فى البرنامج الذى أكتبه لقراءة بيانات من أداة فى برنامج أخر أستخدم الرسائل بكثرة

قمت بتطبيق الأسلوب الذى أوضحته و لكن البرنامج الموجة له الرسالة ينهار و يغلق

فلما عدت للأسلوب العادى كل شئ عمل كما كان

أظن أن هذا الأسلوب لا يصلح مع الunmanaged types

لو أنك قابلتك مشكلة مثل هذه فلتقل لنا عنها

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

بالنسبه للمشكله فهى تحدث بسبب طبيعة البيانات التى يتم تمريرها للنسخه الـ Native من SendMessage، لإنه دائما يتم إرسال مؤشر للقيمه المدخله و لكن الداله SendMessage ليست دائما ما تتعامل مع القيمه التى يتم تمريرها للمعاملان wParam و lParam على انهم مؤشرات و من هنا يحدث الخطأ و لتلاشي هذا الأمر إذا كان نوع البيانات المدخله هى byte او short او int او long (بالإضافة للنسخ الـ unsigned) فلابد من تمريرهم كما هما و غير ذلك (struct او class) فيتم عمل alloc لهم و يتم تمرير المؤشر الخاص بهم.

اعتذر مره اخرى عن هذا الأمر.

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

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 8 يناير 2010 في 02:05

مدونتي: C++ Tips and Tricks

#14

جزاك الله خيرا

لا داعى للإعتزار لم يحدث شئ من أجل الإعتذار :P

و حتى لو كان حدث كنت هشرب من دم الشبح :lol:

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#15
اقتباس
و حتى لو كان حدث كنت هشرب من دم الشبح

اه كده مفيش مشكله :lol:

مدونتي: C++ Tips and Tricks

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