PDA

View Full Version : تشخیص فشرده شدن کلیدهای کیبرد



saeed9982
سه شنبه 22 اسفند 1385, 14:01 عصر
یکی از دوستان سوال کرده بودند که چگونه می توان کلیدهای کیبرد را حتی وقتی فوکوس روی برنامه ما نیست تشخیص داد مانند دیکشنری ها که مثلاً با CTRL+F12 فعال می شوند و یا Keylogger ها که کلیدهای فشرده شده را ثبت می کنند .
من دو روش زیر را برای اینکار پیشنهاد می کنم :

۱ - استفاده از یک تابع کتابخانه ای به اسم GetAsyncKeyState موجود در کتابخانه user32.dll . این تابع ، فشرده شدن یا رها شدن یک کلید را تشخیص می دهد . نحوه declare کردن این تابع بصورت زیر است :

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

حال در برنامه تان یک timer قرار داده و در event آن کد زیر را قرار دهید :

For i = 1 To 255
results = 0
results = GetAsyncKeyState(i)
If results <> 0 Then
Msgbox(Chr(i))
End If
Next



۲ - استفاده از قلاب یا Hook : قلاب ، یک ابزار در مکانیزم مدیریت پیغام سیستم ویندوز است که توسط آن برنامه ها می توانند یک روتین را برای مدیریت و پردازش پیغامهای خاصی قبل از اینکه آن پیغامها به برنامه مقصد برسند نصب نمایند . قلابها باعث کندی سیستم می شوند زیرا حجم پردازشی سیستم روی هر پیغام را افزایش می دهند بنابراین بایستی زمانیکه واقعاً به قلاب نیاز دارید آنرا نصب نموده و هر چه زودتر آنرا حذف نمایید . سیستم ویندوز از انواع زیادی از قلابها پشتیبانی می کند که هر کدام امکان دستیابی به پیغامهای خاصی را مهیا می نمایند برای مثال یک برنامه کاربردی می تواند با استفاده از قلاب کیبرد برای مدیریت و پردازش پیغامهای مربوط به آن ( مثل فشرده شدن یک کلید خاص یا رها شدن آن ) استفاده کند .
برای نصب یک قلاب در برنامه از یک تابع کتابخانه ای به اسم SetWindowsHookEx استفاده می شود . این تابع یک قلاب را به زنجیره قلابهای سیستم اضافه می کند . نحوه declare کردن این تابع بصورت زیر است :

Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long

همچنین برای آزاد کردن یک قلاب و حذف آن از زنجیره قلابها از تابع کتابخانه ای UnhookWindowsHookEx استفاده می گردد . نحوه declare کردن این تابع بصورت زیر است :

Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long

برای ایجاد قلاب کیبرد همچنین نیاز به تعریف یک ثابت است که شماره قلاب کیبرد در آن قرار دارد :

Public Const WH_KEYBOARD = 2

حال بایستی یک تابع پس زمینه یا Callback Function نوشت که به ازای فشرده شدن کیبرد اجرا شود و آدرس آنرا ( با استفاده از کلمه کلیدی Address Of ) بهمراه ثابت فوق به تابع SetWindowsHookEx فرستاد .

hossein-khoshseyar
پنج شنبه 05 اسفند 1389, 09:49 صبح
اگه میشه یه کم راجع به اون روش دوم بیشتر توضیح بدید یا یه مثالی بزنید ممنون میشم

cnmeysam
پنج شنبه 05 اسفند 1389, 19:51 عصر
سلام !

2تا سوال داشتم

تو vb6 چه جوري ميشه كليدهاي كنترلي مثل ctrl ويا alt ويا delete و يا windows رو تغيير داد يعني تو فرو كدي بذاريم كه وقتي ترف كليد alt رو زد تو msgbox بنويسه شما كليد alt رو فشار داده ايد؟؟؟

سوال دوم چه جوري تو تكست باكس وقتي كليد A رو ميزني بنويسه B ؟؟؟؟؟؟؟؟؟؟؟؟؟

ali reza mansoori 2
جمعه 06 اسفند 1389, 14:56 عصر
سوال اول:باید کد اسکی کلید فشرده شده رو چک کنی اگر با کد کلید Ctrl یکی بود پیغام نمایش داده شه
سوال دوم:کد اسکی کلید فشرده شده رو بدست بیار بعد یکی به اون اضافه کن

cnmeysam
جمعه 06 اسفند 1389, 22:31 عصر
مثلا كد اسكي حرف A = 65 و حرف B =66 هست من بايد چي بزنم؟ براي اينكه به جاي A بنويسه B????
در مورد ctrl هم مثلا اگه كد اسكي اون 6 باشه بايد چي نوشت؟
ميشه سورس كدش رو بذارين؟