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

معاي مشكلة في GetAsyncKeyState بالعربية

مغلق
بدأه mybeshoo في 21 مايو 2004 · 12 رد · 1,644 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ....

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

ولكن ما عانيتة هو الحروف العربية .

var
      i : byte;
begin

  for i:=8 To 222 do
    begin
       if GetAsyncKeyState(i)=-32767 then
        begin
        case i of

        8  : memo1.Lines[memo1.Lines.count-1] := copy(memo1.Lines[memo1.Lines.count-1],1,length(memo1.Lines[memo1.Lines.count-1])-1); //Backspace
        9  : memo1.text:=memo1.text+'[Tab]';
        13 : memo1.text:=memo1.text+#13#10; //Enter
        17 : memo1.text:=memo1.text+'[Ctrl]';
        27 : memo1.text:=memo1.text+'[Esc]';
        32 :memo1.text:=memo1.text+' '; //Space
        // Del,Ins,Home,PageUp,PageDown,End
        33 : memo1.text := Memo1.text + '[Page Up]';
        34 : memo1.text := Memo1.text + '[Page Down]';
        35 : memo1.text := Memo1.text + '[End]';
        36 : memo1.text := Memo1.text + '[Home]';
        //Arrow Up Down Left Right
        37 : memo1.text := Memo1.text + '';
        38 : memo1.text := Memo1.text + '[Up]';
        39 : memo1.text := Memo1.text + '';
        40 : memo1.text := Memo1.text + '[Down]';

        44 : memo1.text := Memo1.text + '[Print Screen]';
        45 : memo1.text := Memo1.text + '[Insert]';
        46 : memo1.text := Memo1.text + '[Del]';
        145 : memo1.text := Memo1.text + '[Scroll Lock]';

        //Number 1234567890 Symbol !@#$%^&*()
        48 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+')'
             else memo1.text:=memo1.text+'0';
        49 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'!'
             else memo1.text:=memo1.text+'1';
        50 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'@'
             else memo1.text:=memo1.text+'2';
        51 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'#'
             else memo1.text:=memo1.text+'3';
        52 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'$'
             else memo1.text:=memo1.text+'4';
        53 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'%'
             else memo1.text:=memo1.text+'5';
        54 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'^'
             else memo1.text:=memo1.text+'6';
        55 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'&'
             else memo1.text:=memo1.text+'7';
        56 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'*'
             else memo1.text:=memo1.text+'8';
        57 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'('
             else memo1.text:=memo1.text+'9';
        65..90 : // a..z , A..Z
            begin
            if ((GetKeyState(VK_CAPITAL))=1) then
                if GetKeyState(VK_SHIFT)<0 then
                   memo1.text:=memo1.text+LowerCase(Chr(i)) //a..z
                else
                   memo1.text:=memo1.text+UpperCase(Chr(i)) //A..Z
            else
                if GetKeyState(VK_SHIFT)<0 then
                    memo1.text:=memo1.text+UpperCase(Chr(i)) //A..Z
                else
                    memo1.text:=memo1.text+LowerCase(Chr(i)); //a..z
            end;
        //Numpad
        96..105 : memo1.text:=memo1.text + inttostr(i-96); //Numpad  0..9
        106:memo1.text:=memo1.text+'*';
        107:memo1.text:=memo1.text+'&';
        109:memo1.text:=memo1.text+'-';
        110:memo1.text:=memo1.text+'.';
        111:memo1.text:=memo1.text+'/';
        144 : memo1.text:=memo1.text+'[Num Lock]';

        112..123: //F1-F12
            memo1.text:=memo1.text+'[F'+IntToStr(i - 111)+']';

        186 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+':'
              else memo1.text:=memo1.text+';';
        187 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'+'
              else memo1.text:=memo1.text+'=';
        188 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'<'
              else memo1.text:=memo1.text+',';
        189 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'_'
              else memo1.text:=memo1.text+'-';
        190 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'>'
              else memo1.text:=memo1.text+'.';
        191 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'?'
              else memo1.text:=memo1.text+'/';
        192 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'~'
              else memo1.text:=memo1.text+'`';
        219 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'{'
              else memo1.text:=memo1.text+'[';
        220 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'|'
              else memo1.text:=memo1.text+'\';
        221 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'}'
              else memo1.text:=memo1.text+']';
        222 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'"'
              else memo1.text:=memo1.text+'''';
        end;
        end;
    end;
end;

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

وكما ترون قمت بوضع الأسكي الخاص بالمحارف الغريبة

        17 : memo1.text:=memo1.text+'[Ctrl]';

ولكن ما أريدة ان يتم معرفة في حال كانت الكي بورد تكتب عربي أما لا ...

حاولت ان اضع الأسكي العربي ولكن لا جدوى

سئلت أحد الأصدقاء هو مبرمج فيجوال بيسك فقال لي يجب عليك ان تستخدم الدالة

lng = GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0))

لم اعرف كيف استخدمها في المشروع فهل يتكم احدكم بالمساعدة كيف يمكنني ان اجعل الكود السابق يتحسس العربية ؟
#2

لم اتوقع اني محترف لدرجة ان احد لن يعرف ان يجيب على سؤالي .

بالمناسبة انا صرلي بالدلفي 4 ايام .

هل يعني اني خارق لدرجة ان لا احد يعرف ؟ ام مطنشين ؟

#3

السلام عليك اخي...

للاسف لا بوجد العديد من المبرمجين المحترفين للدلفي في هذا الموقع... ومعظمهم مشغولين

ولاستعمال اي win32 api انصح بزيارة الموقع www.allapi.net لانه يقدم شرح عن جميع الدالات في الوندوز.

ومتأسفين على عدم الرد قبل اليوم

راكان الحنيطي

Be Open Source

opensource-550x4752.gif

#4

كيف يمكن تخديم هذا المتغير ضمن اللغة ؟

lng = GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0))
#5

أعتقد انه هذا الكود

var lng:Double;
lng := GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0))

كل ما اضفته هو ال declare على كل حال يا ريت الاطلاع على الوصلة التي اعطيتك اياها في مشاركتي السابقة

راكان الحنيطي

Be Open Source

opensource-550x4752.gif

#6
[Error] Unit1.pas(30): There is no overloaded version of 'GetWindowThreadProcessId' that can be called with these arguments
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

قد صدر رسالة الخطا السابقة وقد عملت التالي

procedure TForm1.Button1Click(Sender: TObject);
var lng:Double;
begin

lng := GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0));

end;

end.
#7

المشكلة في استدعاء الدالة GetWindowThreadProcessId لانك لا تممر المعطيات الصحيحة للدالة...

راكان الحنيطي

Be Open Source

opensource-550x4752.gif

#8

اخي راكان اشكر جدا تفاعلك معي :)

والله مبتدء انا :)

رحت على الموقع يلي عطيتني ياه مشكورا .

ونزلت الدليل تبع ال API ولم استفد كثيرا منة ربما لانيي لم اتعلم كيف اكتب التعليمة بشكلها الصحيح مما اثار فيني حب الاصرار اكثر ...زز اتمنى منك ان تساعدني .

#9

لو اني اعرف كيفية عمل هذا ال api لساعدتك بالكود لاول مرة... على كل ممكن تزور www.planetsourcecode.com لانه في ملايين الاكواد التي ممكن تساعدك

راكان الحنيطي

Be Open Source

opensource-550x4752.gif

#10

هذا للكتابة بالعربي

LOADKEYBOARdlayout('00000401',klf_activate);

وهذا الكود للكتابة بالأنكليزي

LOADKEYBOARdlayout('00000409',klf_activate);[/

أما بالنسبة للإختبار .. يمكنك إختبار وضع المفاتيحAlt+Shift

#11

هنالك أيضا تعليمات جيدة للمفاتيح : مثل GetAsyncKeyState

var i :integer;

//On timer

begin

for i:=0 to 256 do

if GetAsyncKeyState(i)<>0 then

ListBox1.Items.Add(inttostr(i));

end;

مشكلة الدلفي أنها مفصلة قليلا بالنسبة للفيجوال بيزك .. كيف لو جربت C++ كان موت ....

#12

شكرا لكم اخواني

اعجبني الكود التالي :

var i :integer;
//On timer
begin
for i:=0 to 256 do
if GetAsyncKeyState(i)<>0 then
ListBox1.Items.Add(inttostr(i));
end;

ولكن لم اعرف كيف يمكن التحقق من التالي :

هل زر الكابسلوك فعال لكي يتم كتابة الانجليزي بالحروف الكبيرة

هل لوحة المفاتيح الان عربية ؟ ام انجليزية ؟

اتوقع هذا يتم عن طريق الدالة :

 GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0))

على ان يكون الرد هو اما الترميز العربي :

67175425

أو انجليزي

67699721

ولكن لحد الان لم افلح بكتابتها .

هل مفتاح ال Sheft قيد العمل ؟

في حال ذلك كان صحيح وكانت اللغة هي الانجليزية 67699721

وكمثال صغير عن ذلك بالفيجوال بيسك :

KeyState = Getasynckeystate(65)
If (CAPSLOCKON = True And Shift = 0 And (KeyState And &H1) = &H1) Or (CAPSLOCKON = False And Shift <> 0 And (KeyState And &H1) = &H1) Then
AddText "A"

هكذا يتم اضافة حرف ال A

هذا يوضح الموضوع في حال كان الحرف المضغوط هو A فسوف يتم التحقق من كونة زر الشفت مضغوط وفي حال كانت اللغة انجليزية او عربية

بالنسبة للعربية :

نرى الموضوع كالتالي : بالفيجوال بيسك طبعا .

نعود لحرف ال A والمقابل له هو حرف ال ش

اقتباس
If Shift = 0 And (KeyState And &H1) = &H1 Then

AddText "ش"

End If

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

ارجو من من لدية خبرة ان يضع لي مثال عن ما جرى ولكن بالدلفي راجيا منكم المساعدة جزاكم الله خيرا ,.

#13

للرفع :>

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

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