تشخیص فشرده شدن کليدهای کيبرد


یکی از دوستان سوال کرده بودند که چگونه می توان کلیدهای کیبرد را حتی وقتی فوکوس روی برنامه ما نیست تشخیص داد مانند دیکشنری ها که مثلاً با 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 فرستاد .

برای اطلاعات بیشتر و مشاهده یک نمونه برنامه به این آدرس مراجعه کنید .

 

/ 206 نظر / 139 بازدید
نمایش نظرات قبلی
a.kh

سلام خوبی اگه میشه به ما هم سری بزنید و با هم پیوند بزنیم

پرهام

سلام. خوشحال میشم به وبسایت منم یه سری بزنید. اگه هم خواستید من حاضرم با شما تبادل لینک کنم. شما اول لینک منو اضافه کن بعد توی وبم یه نظر بذار تا لینکت کنم.

مصطفی عبدی

سلام تیم ما یه سایت طراحی کرده که به برنامه نویسان ومهندسین نرم افزار کمک میکنه که در کمترین زمان شغل مورد نظر خودشون مرتبط با تخصص خودشون رو پیدا کنند خوش حال میشیم به سایت ما سر بزنید . karvis.ir مصطفی عبدی ( روابط عمومی کارویس )

مصطفی قادری

برنامه هیتان خیلی سطح پاییین اند لطفا برنامه های در حد برنامه هایی مثل قالببندی در سایت بگذارید

مصطفی قادری ($$$$)

چگونه با زبان vb برنامه ی نصب خودکار سخت افزار های جدید را بنویسیم

شاهرخ

سلام خسته نباشيد برنامه هاي جالبي داريد يه سوال داشتم يه برنامه ميخوام که بشه فايل هاي کمکي (ocx,dll) را از طريق commondialog فراخواني کرد و سپس آنها را ريجستري نمود ممنون ميشم که کمکم کنيد اگه شد برام ميل کنيد forosh_fa@yahoo.com

رضا قدیمی

سلام من از دیروز شروع کردم برنامه نویسی مبتدی مبتدی یه برنامه نوشتم که توان چهارم اعداد رو محاسبه کنه منتها تا 6 حساب می کنه و بعد از 6 این ارور رو میده : run-time error 6: Overflow چطوری این محدودیت رو بردارم؟ پیشاپیش ممنون

hpshk

با سلام اگر مایل هستید تبادل لینک کنیم. پروژه های آماده دانشجویی http://projeamade.persianblog.ir/

احسان

با سلام اگر مایل هستید تبادل لینک کنیم. پروژه های آماده دانشجویی http://projeamade.persianblog.ir/

اسم

سلام راهی رو در وی بی میشناسید ک بتون با استفاده از آن ، موارد تکراری در یک لیست را تشخیص داد و حذف کرد من خودم ی کارایی کردم و اینا رو نوشتم،ولی خب هنو مشکل داره Dim z1, z2 As Integer Dim z3 As Long z1 = 0 z2 = 0 z3 = Val(List1.ListCount) * Val(List1.ListCount) For xi = 1 To z3 If List1.List(z1) = List2.List(z2) Then List1.RemoveItem (z1) List2.RemoveItem (z2) End If If z2 <= (Val(List2.ListCount) - 1) Then z2 = z2 + 1 If z2 > (Val(List2.ListCount) - 1) Then z2 = 0 z1 = z1 + 1 End If Next xi ببین منظورم اینه برنامه بیاد گزینه اول لیست 1 رو با رو با تک تک گزینه های لیست 2 چک کنه ، اگه مشابه نبود به لیست سوم اضافه کنه ، ولی اگه مشابه بود ب محض اینکه یه مورد مشابه پیدا کرد ، هر دو تا رو حذف کنه ینی هم از لیست 1 اون مورد رو حذف کنه ، هم از لیست 2 ممنون میشم کمکم کنین