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

[ تمت الإجابة ]كيف تحدد لغة الكتابة الحالية؟

مغلق
بدأه Xacker في 20 أغسطس 2008 · 11 رد · 3,148 مشاهدة · في أرشيف قسم Windows APIs
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

حاولت بالعديد من الوظائف

GetKeyboardLayout

GetKeyboardLayoutName

GetSystemDefaultLangID

GetUserDefaultLangID

لكن لم أحصل على شئ مما أردته ففي كل الأحوال تقريبا النتيجة غير المطلوبة

اما ترجع 0x0409 دوماً للغة الانكليزية

او ترجع 0x2801 دوماً من خلال GetUserDefaultLangID مثلاً.

أيضا بحثت في الـ locale

هل هناك وظيفة مباشرة أو مجموعة وظائف؟

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#2

لم افهم ما تقصده :wacko:

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3
http://msdn.microsoft.com/en-us/library/ms646305.aspx

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

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#4

شكراً أخي أحمد، بعد زمان يا رجل لم أرى مشاركة لك

أعلم مشاغلك كثيرة وفقك الله لما تحب

أخي أحمد، أخي محمد،

ليس المطلوب تحويل لغة الكتابة الحالية إلى لغة أخرى من اللغات الموجودة لدى المستخدم وإنما معرفة اللغة التي يستخدمها المستخدم الآن للكتابة وهذا سبب "كما ترى" استخدامي للدوال التي ترجع شئ ما وليس العكس.

أنا قمت بوضع hook على WH_KEYBOARD_LL وأقوم بفلترة المحتويات، تسجيلها، منعها.. شئ مثل keylogger لكن المشكلة أن القيم التي تعود من WH_KEYBOARD_LL بالتحديد وليس WH_KEYBOARD والله أعلم لا تتأثر بالـ locale المستخدمة حالياً (لغة الكتابة مثلاً العربية) وإنما تعيد الحروف المقابلة لها, يعني عندما ينقر المستخدم لإدخال حرف "م" مثلاً فما أحصل عليه هو حرف "L" المتوضع بنفس الزر،

الفكرة هي في أني حاولت أن أقوم بالاعتماد على فكرة تحديد متى ينقر المستخدم alt+shift اليمين وأعتبر المدخلات بعدها باللغة العربية ومتى العكس, لكن هذا معقد خصوصاً أن هناك طرق كثيرة للتحويل للكتابة باللغة العربية مثل تغيير هذه المفاتيح أساساً من لوحة التحكم خيارات الكيبورد أو أن يكون المستخدم أساساً يستخدم اللغة العربية قبل تشغيل البرنامج.

في هذه الحالة الطريقة الوحيدة "السهلة" بنظري ليس بوضع اختبارات كثيرة على المفاتيح النشطة (لأنها ليست سهلة بنظري) وإنما البحث عن طريقة لتحديد لغة الكتابة الحالية.

وجدت دوال عديدة لكنها للأسف لأنظمة تشغيل مختلفة مثل الدوال الخاصة بماكنتوش وهذا طبعاً ليس ما أبحث عنه.

فهل هناك ما يحل هذه المشكلة؟

بارك الله بكم

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

GetKeyboardLayoutName Function

http://msdn.microsoft.com/en-us/library/ms646298(VS.85).aspx

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

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#6
Xacker كتب:
حاولت بالعديد من الوظائف

GetKeyboardLayout

GetKeyboardLayoutName

GetSystemDefaultLangID

GetUserDefaultLangID

لكن لم أحصل على شئ مما أردته ففي كل الأحوال تقريبا النتيجة غير المطلوبة

ترجع 0x0409 دوماً للغة الانكليزية

جربتها أخي أحمد، لكن حتى لو كانت لغة الكتابة عربية ما يرجع دوما هو 00000409 الذي يدل على اللغة الانكليزية

وهذا ما استغربته.

سؤال: هل تعتقد أن إلغاء ظهور خيار التبديل بين اللغتين الذي يظهر بشكل افتراضي للمرة الأولى عند تشغيل الويندوز في الـ systray تقريبا متعلق بعدم عمل هذه الوظيفة؟ فأنا ألغيه دوماً مثلاً..

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#7

الأمر لا علاقة له بالأيقونة الـSystray بل بالـthread الذي تجري عليه دالة GetKeyboardLayout .

قمت بعمل مثال لتوضيح ذلك ,, افتح النوتباد وشغل الكود التالي :

[color= #0000ff;]int main[color= #000000;]([color= #0000ff;]int argc, [color= #0000ff;]char[color= #000000;]* argv[color= #000000;][[color= #000000;]][color= #000000;])

[color= #000000;]{

	DWORD kla;

	DWORD threadId [color= #000000;]= GetWindowThreadProcessId[color= #000000;](FindWindow[color= #000000;]([color= #ff0000;]0, [color= #A31515;]"Untitled - Notepad"[color= #000000;]), [color= #ff0000;]0[color= #000000;]);

	kla [color= #000000;]= [color= #000000;](DWORD[color= #000000;])GetKeyboardLayout[color= #000000;](threadId[color= #000000;]);

	printf[color= #000000;]([color= #A31515;]"%p [color= #A31515; font-weight: bold;]n", LOWORD[color= #000000;](kla[color= #000000;])[color= #000000;]);

	system[color= #000000;]([color= #A31515;]"pause"[color= #000000;]);

	kla [color= #000000;]= [color= #000000;](DWORD[color= #000000;])GetKeyboardLayout[color= #000000;](threadId[color= #000000;]);

	printf[color= #000000;]([color= #A31515;]"%p [color= #A31515; font-weight: bold;]n", LOWORD[color= #000000;](kla[color= #000000;])[color= #000000;]);

	system[color= #000000;]([color= #A31515;]"pause"[color= #000000;]);

	[color= #0000ff;]return [color= #ff0000;]0;

[color= #000000;]};

غير بعد أول مرة اللغة وسيتغير الناتج .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#8

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

لا زلت في طور التعديل على البرنامج الآن لكي يقوم باخراج الحروف العربية من الحروف الانكليزية المقابلة.

استطعت الحصول على عبارة عربية نظامية

لكن هل تعلم انه بدل ان يضع قيمة الـ langid الخاصة باللغة العربية هو يعيد 0 لدي في المسجل EAX

شكرا على التذكير

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#9

في الحقيقة لم اتعامل مع هذه الأمور من قبل ,, ربما يفيدك Open src keylogger .

اذا وجدت واحد في الأرشيف عندي يدعم تعدد اللغات ساضعه .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#10

اممم..

ما زال هناك مشكلة

يجب ان أراها عندما أعود لجهازي

هنا مقاس الشاشة صغير جداً لا استطيع حتى ان اقرأ الكود كامل

هناك خطأ ما

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#11

نفس الخطأ الذي كنت أقع فيه ,,, والله لدرجة إني شكبت في نفسي :S

كل مرة تعود بقيمة اللغة الإنجليزية :)

شكراً لك أخ GM << أسأل الله أن يجزيك خير الجزاء ,,,

-----------------------

أخ Xacker ,

لا أدري إن كنت قد توصلت لهذا من قبلي , لكن أريد أن أنوه للدالة ToAscii التي قد تفيد في هذه الحالة لترجمة النص ,,,

http://msdn.microsoft.com/en-us/library/ms646316(VS.85).aspx

أسأل الله أن يوفقنا لما فيه الخير , تقبلوا مروري ,,, وآسف إذا رفعت الموضوع بدون فائدة :P

#12

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

ومشكور على تذكيري بالموضوع بالرفع ;)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

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

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