حسـن
06-02-2005, 10:47 AM
لعبة هالف لايف تو لا تدعم الكتابة بالعربية بشكل مباشر مع ان المحرك نفسه يدعم اظهار الاحرف العربية و لكن اذا جربت مثلا الدردشة في كاونتر سترايك سورس بالعربي ستجد ان الحروف منفصلة و انها تظهر من اليسار لليمين يعني المحرك لا يميز هذه الحروف و يتعامل معها مثل اي رمز اخر لا يحتاج الى معالجة خاصة.
بالنسبة للعبة كونتر سترايك سورس فلا نستطيع عمل شيء لها الا اذا قامت الشركة باضافة دعم للغة العربية .. و هذا امر ف يعلم الغيب لان الشركة قامت باضافة عدة لغات و ربما و الله اعلم تقوم باضافة المزيد و لكن لا ادري ما اللذي سيجدفعهم لدعم الغة العربية فلا اظن الزبائن العرب كثر ..
المهم .. انا قلت اننا لا نستطيع عمل شي لكاونتر سترايك, لكننا نستطيع عمل شي في هاف لايف تو نفسها :D لان هناك SDK للعبة و يحتوي على كمية كبيرة من كود اللعبة بما في ذلك الـ vgui او واجهة "فالف" المرئية, و هذا يتضمن هذا ادوات التحكم vgui controls مثل ادوات تحرير النصوص (اللتي يستخدمها الشات) و غيرها الكثير.
قرأت في احد المواضيع القديمة في منتدى العاب البي سي واحد من الشباب يقول انه سيحاول ان يظبط حركة لدعم العربي باستخدام الـ SDK لكني لا اذكر من ذلك الشخص و لم اتابعه .. المهم انا اعرف الان ان السرفر السعودي يعمل حيلة لاظهار نصوص الشات بالعربي و ذلك بتحليل النص و اظهاره في الركن العلوي من الشاشة .. اظن هذا يحدث عن طريق plug-in للسرفر, و لا ادري ان كان من برمجه هو نفس ذلك الأخ ام لا .. لكني نزلت برنامج صغير له يقوم بعمل شي مشابه و لكن على الـ OpenGL و اظن اسم البرنامج هو Glal32 او شي من هالقبيل ..
المهم انا وقتها فكرت في اني احاول اعمل هذا الشي, و انا من هواة برمجة هاف لايف تو و عندي الاس دي كي فقلت ليش ما اجرب :D
طبعا بعد ما عرفت كمية الكود المتوفرة و اعطائنا حق الوصول لاشياء دقيقة مثل هذي الأمور, قررت اني احاول استكشف عن طرق لتحويل النصوص العربية المكسرة الى نصوصو صحيحة .. اي ترتيبها من اليمين الى اليسار و ربط الحروف ببعضها ..
بصراحة بحثت كثيرا و لكن دون جدوى, هناك اشياء في الوندوز اظن ان الواحد ممكن يستدعيها و هي تقوم له بهذا العمل .. و لكن لم اعرف كيف يتم ذلك ..
المهم .. في النهاية قررت اني اكتب هذي الأشياء بنفسي :p ليش لا .. هي شينرادلهة؟ تاخذ مجموعة حروف و تبرتبها من اليمين لليسار اذا كانت عربية, و بعدين تاخذ كل حرف و تشوف شنو اللي كبلة و شنو اللي بعده و على اساها تحدد ما هو الشكل اللذي يجب ان يكون عليه الحرف!
طبعا كان على اقيام ببعض البحث او "البحوث" لاحصل على الأقل على جدول يضم اكواد الحروف العربية و احوال فهم كيف يمكن اخذ نص متداخل يحتوي حروفا عربية و انجليزية و تحليله لتكوين نص جديد تكون فيه الحروف العربية مرتبة بالشكل الصحيح .. الخ.
المشكلة اني لا احب التعامل مع النصوص c-style strings كثيرا و لكن على كل حال في الجامعة اجبرونا ان نكتب عدة برامج تتعامل مع النصوص مباشرة دون استخدام مكتبات جاهزة لذا تعودت على الأمر بعض الشيء .. فهذه نقطة ..
الجزء المقرف في العملية هي انني لازم اخذ رقم الـيونيكود لكل حرف و ادخاله في ما يشبه جدول, في الحقيقة هو ليس جدول بمعنى الكلمة, هي linked list تربط objects من نوع CHarf و هو كلاس كتبته لاحتواء الحروف العربية و خصائصها .. مثلا كل حرف عنده اربع اشكال مختلفة (ابتدائي, متوسط .. الخ) و كذلك بعض الحروف لا ترتبط بالحروف اللتي تليها. المهم .. المشكلة كانت استخراج الاكواد المختلفة لكل حرف و ادخالها في الكود ..
طبعا لم ادخل كل الحروف .. ادخلت فقط الحروف الأساسية بالاضافة الى التاء المربوطة .. و لكن مثلا الحركات و الحروف اللتي فوقها همزة لم أدخلها .. (على الأقل حتى الآن)
الحمد لله حصلت على نتيجة لا بأس بها, حيث استطيع الان كتابة النصوص و تظهر بشكل صحيح اثناء كتابتها و عند الانتهاء من كتابتها كذلك .. المشكلة الوحيدة ان بعض الحروف تظهر بشكل سيء و اظن ان المسألة تكمن في صغر حجم الخط او شي من هذا القبيل .. لأنني حين اكبر الخط قليلا تتحسن الأمور و لكن الخط يخرج عن النطاق المحدد له :p
كذلك استطيع تحريك مؤشر الكتابة و ادخال حرف في أي مكان و لكن قد لا يظهر الحرف الجديد دائما في مكانه الصحيح (المكان اللذي فيه المؤشر) فهذه نقطة لا تزال تحتاج لبعض العمل ..
النقطة الاخرى هي ان بعض الحروف هي عبارة عن دمج بين حرفين .. مثل الالف و اللام "لا" و انا لم اضف هذه الخاصية .. و كذلك الحركات يجب ان تظهر فوق الحروف .. هذه لا اعرف ان كان من الممكن اضافتها حيث لا اظن ان هناك كود لكل حرف فوقه حركة بل دمج الحرف مع الحركة يجب ان تكون من مهام الـ renderer اللذي سيرسم النص.
المشكلة الاخرى ااني اكتشفت للتو انني نسيت اضافة الألف المقصورة :D
هناك شي آخر مزعج شوية, عندما تضغط حرف الذال يطلعلك الكونسول! اظن ممكن نتلص منها بسهولة .. بس عموما!
المهم اظن ان هذا العمل سيذهب دون ان يستفيد منه احد سواى, و الاستفادة هنا اقصد بها اكتساب بعض الخبرة.
لذلك اريد عرضه هنا لعل تكون فيه فائدة إن شاء الله.
الفكرة هنا هي اخذ النص غير المرتب ثم ترتيبه .. كالتالي:
لو كتبت كلمة "عربي" مثلا, فسوف تظهر بهذا الشكل:
ي ب ر ع
بدون مسافات ..
ما اريد عمله هو عكس ترتيب الحروف و تغيير هيئتها, لتصبح هكذا:
عـ ـر ـبـ ـي
ايضا بدون مسافات, و هذه الحروف موجودة بهذا الشكل (تقريبا) في جودل اليونيكود.
لا تقرأو الحروف من اليمين لليسار, بل من اليسار لليمين! يعني في السابق كان اول حرف هو "ع", أنا اريد تحوله الى "ـي" .. و هكذا.
فبهذه الطريقة, نستطيع اظهار الحروف بشكل مرتب!
و لكن ترتيب الحروف المرئي هكذا لا علاقة له بترتيبها في الذاكرة, و هذا يترتب عليه عدة مشاكل, احداها ان مؤشر المكتابة عندة يكون بين اول و ثاني حرف, فمكانه الفعلي هو بين العين و الراء:
ي ب ر | ع
و لكننا بعدما نحول النص الى العربي, سيظهر المؤشر بين الياء و الباء
عـ ـر ـبـ | ـي
لكننا لو كتبنا هنا حرف فان الحرف سيدخل في الذاكرة بين العين و الراء, فبالتالي سيدخل في النص بين العين و الراء, لذلك نحتاج لتحليل مكان المؤشر و معرفة انه من الناحية البصرية يجب ان يظهر بين الحرف الثالث و الرابع
عـ | ـر ـبـ ـي
فهناك اذا شيئين: هناك تمثيل للنص في الذكارة و هذا التمثيل غير مرتب اي انه يعامل الحروف العربية مثل اي رمز اجنبي ولا يضعها في نطاقها الصحيح.
و هناك تمثيل بصري للنص, يظهر الحروف للقاريء في مكانها الصحيح لكنه ليس سوى تمثيل بصري للنص, و النص الحقيقي اللذي يقوم اللاعب بإدخاله هو في الـ string الغير مرتب.
نفس الشي للمؤشر, هناك مؤشران, مؤشر يعني بمكان المؤشر الحقيقي وسط الحروف كما هي ممثلة في الذاكرة, و مؤشر بصري يعني بمحاكاة مكان المؤشر وسط الحروف المرتبة ليسهل على المستخدم ادخال حروف وسط الحروف العربية لتظهر في مكانها الصحيح.
المهم, قمت باضافة ملفين, او بالأحرى صنفين two classes ووضعت كل كلاس في ملف.
الاول يعنى بتوصيف الحروف و الاخر يعنى بمعالجة النصوص و تحويلها الى العربية, كما يقوم ايضا يمعالجة مكان المؤشر ..
و قمت بعمل function ياخذ string و int يمثل مكان المؤشر و يحولها الى العربية.
void ParseRTL( wchar_t *str, int &cursor )
فهذا كل ما احتاج اليه من "الخارج" لاستخدام الكود اللذي يقوم بعمليات التحويل ..
لاتسخدامه, قمت بعمل شيئين, اولا أضفت member variable للـ CTextEnty كلاس و هو المعنى بإدخال النصوص في الـ VGUI, اضفت متغير int _cursorRtlPos لاحتواء مكان المؤشر (البصري) او اللذي سيرسم على الشاشة.
في
void TextEntry::PaintBackground()
اضفت هذه الأسطر اول شي:
//hasan: my RTL thing
wchar_t chat_text[300];
//copy cursor
_cursorRtlPos = _cursorPos;
if(m_TextStream.Count())
{
//copy string ..
for ( int i = 0; i < m_TextStream.Count(); i++)
{
chat_text[i] = m_TextStream[i];
chat_text[i + 1] = 0;
}
ParseRTL( chat_text, _cursorRtlPos );
_font = 128;
}
و هي ببساطة تنظر في ما إذا كان هناك نص يتم ادخاله, ففي تلك الحالة سنقوم بعمل c-style string او مصفوفة من نوع wchar_t ننسخ فيها النص المكتوب في الشات ثم نقوم بتعديله. و كذلك نقوم بتحليل مكان المؤشر "البصري".
في اسفل الـ method هناك كود تقوم بلوب على الحروف حرفا حرف و ترسمه.
قمت بتغيير بسيط في هذا الكود ليأخذ الحروف من النص المعدل بدل النص الأصلي.
else
{
// draw the text
for ( int i = startIndex; i < m_TextStream.Count(); i++)
{
wchar_t ch = m_TextStream[i];
حولتها إلى:
else
{
// draw the text
for ( int i = startIndex; i < m_TextStream.Count(); i++)
{
//wchar_t ch = m_TextStream[i];
wchar_t ch = chat_text[i];
و أخيرا في
bool TextEntry::DrawCursor(int x, int y)
قمت بتغيير بسيط لكي يقوم المحرك باستخدام _cursorRtlPos بدل _cursorPos
bool TextEntry::DrawCursor(int x, int y)
{
if (!_cursorBlink)
{
//hasan
//use RTL cursor position ..
int cx, cy;
//CursorToPixelSpace(_cursorPos, cx, cy);
CursorToPixelSpace(_cursorRtlPos, cx, cy);
هذا فيما يتعلق بالـ vgui_controls
اما الكود اللتي قمت بكتابتها لمعالجة الحروف و النصوص فأرفقها إن شاء الله و حقوق الاستخدام للجميع تحت شروط الـ GPL (اللتي لا اعرفها كلها اصلا) لكن باختصار اذا قمت بتعديل فلا يحق لك الاحتفاظ به لنفسك (يعني لازم تنشره!!) و طبعا يحق لك استخدامها و التعديل عليها كما تشاء بشرط عدم اساءة الاستخدام مثل ان تدعي انك انت من كتب الكود او ان تستخدمها فيما يغضب الله او يضر الاسلام ولا ينفعه.
اسف لضعف الشرح .. شرحت فقط ما قمت بعمله في الـ SDK نفسه بدلا من ان اضع ملفا كبيرا من اجل عدة اسطر فقط قمت بتغييرها ..
اما الكود الحقيقي فقد قمت بإرفاقه فقط دون شرح حقيقة.
طبعا اعرف ان الكود قد لا تكون له فائدة عملية (على الأقل حاليا) لان هناك ربما طرق اسهل باستخدام وندوز لكني كما قلت لا اعرف بالظبط كيف يمكن استدعاء وندوز للقيام بالعملية لأجلنا, كما ان برمجة مثل هذه الأمور تفيد الانسان لتعلم و اكتساب الخبرة.
و من يدري .. مش يمكن يأتي ناس ياخذون الكود هذي و يطوروها و يستخدموها بشكل جدي؟ :P (من محسب نفسه الأخ!)
المهم .. enjoy :D
إن شاء الله قريبا ارفق فيديو لعملية الكتابة باستخدام هذا الكود .. إن شاء الله
بالنسبة للعبة كونتر سترايك سورس فلا نستطيع عمل شيء لها الا اذا قامت الشركة باضافة دعم للغة العربية .. و هذا امر ف يعلم الغيب لان الشركة قامت باضافة عدة لغات و ربما و الله اعلم تقوم باضافة المزيد و لكن لا ادري ما اللذي سيجدفعهم لدعم الغة العربية فلا اظن الزبائن العرب كثر ..
المهم .. انا قلت اننا لا نستطيع عمل شي لكاونتر سترايك, لكننا نستطيع عمل شي في هاف لايف تو نفسها :D لان هناك SDK للعبة و يحتوي على كمية كبيرة من كود اللعبة بما في ذلك الـ vgui او واجهة "فالف" المرئية, و هذا يتضمن هذا ادوات التحكم vgui controls مثل ادوات تحرير النصوص (اللتي يستخدمها الشات) و غيرها الكثير.
قرأت في احد المواضيع القديمة في منتدى العاب البي سي واحد من الشباب يقول انه سيحاول ان يظبط حركة لدعم العربي باستخدام الـ SDK لكني لا اذكر من ذلك الشخص و لم اتابعه .. المهم انا اعرف الان ان السرفر السعودي يعمل حيلة لاظهار نصوص الشات بالعربي و ذلك بتحليل النص و اظهاره في الركن العلوي من الشاشة .. اظن هذا يحدث عن طريق plug-in للسرفر, و لا ادري ان كان من برمجه هو نفس ذلك الأخ ام لا .. لكني نزلت برنامج صغير له يقوم بعمل شي مشابه و لكن على الـ OpenGL و اظن اسم البرنامج هو Glal32 او شي من هالقبيل ..
المهم انا وقتها فكرت في اني احاول اعمل هذا الشي, و انا من هواة برمجة هاف لايف تو و عندي الاس دي كي فقلت ليش ما اجرب :D
طبعا بعد ما عرفت كمية الكود المتوفرة و اعطائنا حق الوصول لاشياء دقيقة مثل هذي الأمور, قررت اني احاول استكشف عن طرق لتحويل النصوص العربية المكسرة الى نصوصو صحيحة .. اي ترتيبها من اليمين الى اليسار و ربط الحروف ببعضها ..
بصراحة بحثت كثيرا و لكن دون جدوى, هناك اشياء في الوندوز اظن ان الواحد ممكن يستدعيها و هي تقوم له بهذا العمل .. و لكن لم اعرف كيف يتم ذلك ..
المهم .. في النهاية قررت اني اكتب هذي الأشياء بنفسي :p ليش لا .. هي شينرادلهة؟ تاخذ مجموعة حروف و تبرتبها من اليمين لليسار اذا كانت عربية, و بعدين تاخذ كل حرف و تشوف شنو اللي كبلة و شنو اللي بعده و على اساها تحدد ما هو الشكل اللذي يجب ان يكون عليه الحرف!
طبعا كان على اقيام ببعض البحث او "البحوث" لاحصل على الأقل على جدول يضم اكواد الحروف العربية و احوال فهم كيف يمكن اخذ نص متداخل يحتوي حروفا عربية و انجليزية و تحليله لتكوين نص جديد تكون فيه الحروف العربية مرتبة بالشكل الصحيح .. الخ.
المشكلة اني لا احب التعامل مع النصوص c-style strings كثيرا و لكن على كل حال في الجامعة اجبرونا ان نكتب عدة برامج تتعامل مع النصوص مباشرة دون استخدام مكتبات جاهزة لذا تعودت على الأمر بعض الشيء .. فهذه نقطة ..
الجزء المقرف في العملية هي انني لازم اخذ رقم الـيونيكود لكل حرف و ادخاله في ما يشبه جدول, في الحقيقة هو ليس جدول بمعنى الكلمة, هي linked list تربط objects من نوع CHarf و هو كلاس كتبته لاحتواء الحروف العربية و خصائصها .. مثلا كل حرف عنده اربع اشكال مختلفة (ابتدائي, متوسط .. الخ) و كذلك بعض الحروف لا ترتبط بالحروف اللتي تليها. المهم .. المشكلة كانت استخراج الاكواد المختلفة لكل حرف و ادخالها في الكود ..
طبعا لم ادخل كل الحروف .. ادخلت فقط الحروف الأساسية بالاضافة الى التاء المربوطة .. و لكن مثلا الحركات و الحروف اللتي فوقها همزة لم أدخلها .. (على الأقل حتى الآن)
الحمد لله حصلت على نتيجة لا بأس بها, حيث استطيع الان كتابة النصوص و تظهر بشكل صحيح اثناء كتابتها و عند الانتهاء من كتابتها كذلك .. المشكلة الوحيدة ان بعض الحروف تظهر بشكل سيء و اظن ان المسألة تكمن في صغر حجم الخط او شي من هذا القبيل .. لأنني حين اكبر الخط قليلا تتحسن الأمور و لكن الخط يخرج عن النطاق المحدد له :p
كذلك استطيع تحريك مؤشر الكتابة و ادخال حرف في أي مكان و لكن قد لا يظهر الحرف الجديد دائما في مكانه الصحيح (المكان اللذي فيه المؤشر) فهذه نقطة لا تزال تحتاج لبعض العمل ..
النقطة الاخرى هي ان بعض الحروف هي عبارة عن دمج بين حرفين .. مثل الالف و اللام "لا" و انا لم اضف هذه الخاصية .. و كذلك الحركات يجب ان تظهر فوق الحروف .. هذه لا اعرف ان كان من الممكن اضافتها حيث لا اظن ان هناك كود لكل حرف فوقه حركة بل دمج الحرف مع الحركة يجب ان تكون من مهام الـ renderer اللذي سيرسم النص.
المشكلة الاخرى ااني اكتشفت للتو انني نسيت اضافة الألف المقصورة :D
هناك شي آخر مزعج شوية, عندما تضغط حرف الذال يطلعلك الكونسول! اظن ممكن نتلص منها بسهولة .. بس عموما!
المهم اظن ان هذا العمل سيذهب دون ان يستفيد منه احد سواى, و الاستفادة هنا اقصد بها اكتساب بعض الخبرة.
لذلك اريد عرضه هنا لعل تكون فيه فائدة إن شاء الله.
الفكرة هنا هي اخذ النص غير المرتب ثم ترتيبه .. كالتالي:
لو كتبت كلمة "عربي" مثلا, فسوف تظهر بهذا الشكل:
ي ب ر ع
بدون مسافات ..
ما اريد عمله هو عكس ترتيب الحروف و تغيير هيئتها, لتصبح هكذا:
عـ ـر ـبـ ـي
ايضا بدون مسافات, و هذه الحروف موجودة بهذا الشكل (تقريبا) في جودل اليونيكود.
لا تقرأو الحروف من اليمين لليسار, بل من اليسار لليمين! يعني في السابق كان اول حرف هو "ع", أنا اريد تحوله الى "ـي" .. و هكذا.
فبهذه الطريقة, نستطيع اظهار الحروف بشكل مرتب!
و لكن ترتيب الحروف المرئي هكذا لا علاقة له بترتيبها في الذاكرة, و هذا يترتب عليه عدة مشاكل, احداها ان مؤشر المكتابة عندة يكون بين اول و ثاني حرف, فمكانه الفعلي هو بين العين و الراء:
ي ب ر | ع
و لكننا بعدما نحول النص الى العربي, سيظهر المؤشر بين الياء و الباء
عـ ـر ـبـ | ـي
لكننا لو كتبنا هنا حرف فان الحرف سيدخل في الذاكرة بين العين و الراء, فبالتالي سيدخل في النص بين العين و الراء, لذلك نحتاج لتحليل مكان المؤشر و معرفة انه من الناحية البصرية يجب ان يظهر بين الحرف الثالث و الرابع
عـ | ـر ـبـ ـي
فهناك اذا شيئين: هناك تمثيل للنص في الذكارة و هذا التمثيل غير مرتب اي انه يعامل الحروف العربية مثل اي رمز اجنبي ولا يضعها في نطاقها الصحيح.
و هناك تمثيل بصري للنص, يظهر الحروف للقاريء في مكانها الصحيح لكنه ليس سوى تمثيل بصري للنص, و النص الحقيقي اللذي يقوم اللاعب بإدخاله هو في الـ string الغير مرتب.
نفس الشي للمؤشر, هناك مؤشران, مؤشر يعني بمكان المؤشر الحقيقي وسط الحروف كما هي ممثلة في الذاكرة, و مؤشر بصري يعني بمحاكاة مكان المؤشر وسط الحروف المرتبة ليسهل على المستخدم ادخال حروف وسط الحروف العربية لتظهر في مكانها الصحيح.
المهم, قمت باضافة ملفين, او بالأحرى صنفين two classes ووضعت كل كلاس في ملف.
الاول يعنى بتوصيف الحروف و الاخر يعنى بمعالجة النصوص و تحويلها الى العربية, كما يقوم ايضا يمعالجة مكان المؤشر ..
و قمت بعمل function ياخذ string و int يمثل مكان المؤشر و يحولها الى العربية.
void ParseRTL( wchar_t *str, int &cursor )
فهذا كل ما احتاج اليه من "الخارج" لاستخدام الكود اللذي يقوم بعمليات التحويل ..
لاتسخدامه, قمت بعمل شيئين, اولا أضفت member variable للـ CTextEnty كلاس و هو المعنى بإدخال النصوص في الـ VGUI, اضفت متغير int _cursorRtlPos لاحتواء مكان المؤشر (البصري) او اللذي سيرسم على الشاشة.
في
void TextEntry::PaintBackground()
اضفت هذه الأسطر اول شي:
//hasan: my RTL thing
wchar_t chat_text[300];
//copy cursor
_cursorRtlPos = _cursorPos;
if(m_TextStream.Count())
{
//copy string ..
for ( int i = 0; i < m_TextStream.Count(); i++)
{
chat_text[i] = m_TextStream[i];
chat_text[i + 1] = 0;
}
ParseRTL( chat_text, _cursorRtlPos );
_font = 128;
}
و هي ببساطة تنظر في ما إذا كان هناك نص يتم ادخاله, ففي تلك الحالة سنقوم بعمل c-style string او مصفوفة من نوع wchar_t ننسخ فيها النص المكتوب في الشات ثم نقوم بتعديله. و كذلك نقوم بتحليل مكان المؤشر "البصري".
في اسفل الـ method هناك كود تقوم بلوب على الحروف حرفا حرف و ترسمه.
قمت بتغيير بسيط في هذا الكود ليأخذ الحروف من النص المعدل بدل النص الأصلي.
else
{
// draw the text
for ( int i = startIndex; i < m_TextStream.Count(); i++)
{
wchar_t ch = m_TextStream[i];
حولتها إلى:
else
{
// draw the text
for ( int i = startIndex; i < m_TextStream.Count(); i++)
{
//wchar_t ch = m_TextStream[i];
wchar_t ch = chat_text[i];
و أخيرا في
bool TextEntry::DrawCursor(int x, int y)
قمت بتغيير بسيط لكي يقوم المحرك باستخدام _cursorRtlPos بدل _cursorPos
bool TextEntry::DrawCursor(int x, int y)
{
if (!_cursorBlink)
{
//hasan
//use RTL cursor position ..
int cx, cy;
//CursorToPixelSpace(_cursorPos, cx, cy);
CursorToPixelSpace(_cursorRtlPos, cx, cy);
هذا فيما يتعلق بالـ vgui_controls
اما الكود اللتي قمت بكتابتها لمعالجة الحروف و النصوص فأرفقها إن شاء الله و حقوق الاستخدام للجميع تحت شروط الـ GPL (اللتي لا اعرفها كلها اصلا) لكن باختصار اذا قمت بتعديل فلا يحق لك الاحتفاظ به لنفسك (يعني لازم تنشره!!) و طبعا يحق لك استخدامها و التعديل عليها كما تشاء بشرط عدم اساءة الاستخدام مثل ان تدعي انك انت من كتب الكود او ان تستخدمها فيما يغضب الله او يضر الاسلام ولا ينفعه.
اسف لضعف الشرح .. شرحت فقط ما قمت بعمله في الـ SDK نفسه بدلا من ان اضع ملفا كبيرا من اجل عدة اسطر فقط قمت بتغييرها ..
اما الكود الحقيقي فقد قمت بإرفاقه فقط دون شرح حقيقة.
طبعا اعرف ان الكود قد لا تكون له فائدة عملية (على الأقل حاليا) لان هناك ربما طرق اسهل باستخدام وندوز لكني كما قلت لا اعرف بالظبط كيف يمكن استدعاء وندوز للقيام بالعملية لأجلنا, كما ان برمجة مثل هذه الأمور تفيد الانسان لتعلم و اكتساب الخبرة.
و من يدري .. مش يمكن يأتي ناس ياخذون الكود هذي و يطوروها و يستخدموها بشكل جدي؟ :P (من محسب نفسه الأخ!)
المهم .. enjoy :D
إن شاء الله قريبا ارفق فيديو لعملية الكتابة باستخدام هذا الكود .. إن شاء الله