PDA

View Full Version : حرفه ای: ثبت کلید های فشرده شده در حالتی که فرم فکوس ندارد.



just4froum
جمعه 25 شهریور 1390, 01:31 صبح
با سلام به همگی :

همگی می دونیم که با تابع GetAsyncKeyState میشه کلید های فشرده شده رو ذخیره کرد فقط کافیه توی یک حلقه تکرار در یک تایمر بگذازیم و ... مثل کد زیر
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Sub Form_Load()
Timer1.Interval = 100
End Sub
Private Sub Timer1_Timer()
Dim x As Integer, m As Integer
For x = 48 To 90
If GetAsyncKeyState(x) <> 0 Then
m = GetAsyncKeyState(x)
If m <> 0 Then Label1.Caption = Label1.Caption & Chr(x)
End If
Next x
End Sub

(البته کد بالا برای اعداد و حروف است)

حالا مشکل من این است که اگر کاربر کلیدی را نگه دارد مثل این میمونه که چندین بار آن کلید را فشار داده البته من با کد زیر تقریبا مشکل زیر را حل کردم :
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Dim m As Integer
Private Sub Form_Load()
Timer1.Interval = 1
Timer2.Interval = 300
Timer2.Enabled = False
End Sub
Private Sub Timer1_Timer()
Dim x As Integer
For x = 48 To 90
If GetAsyncKeyState(x) = -32768 Then
Timer2.Enabled = True
If m <> x Then
Label1.Caption = Label1.Caption & Chr(x) & " "
m = x
End If
End If
Next x
End Sub
Private Sub Timer2_Timer()
Timer2.Enabled = False
m = Empty
End Sub


اما مشکل اینجاست اگر کاربر یک کلید را دوبار پشت سر هم بزند کلید ثبت نمی شود.

حالا به نظر شما من چی کار کنم یعنی با یک فشردن یک کلید کلید یکبار ثبت شود هر چقدر هم که نگه داشته شود و اگر همان کلید باز فشرده شد یکبار دیگر ثبت شود ؟؟؟

آیا api وجود دارد که شبیه رویداد key up form باشد ؟؟؟







با تشکر .

محسن واژدی
جمعه 25 شهریور 1390, 08:11 صبح
سلام علیکم
قبلا" در مبحث ایجاد ماکرو یکی از دوستان راه حلی در دریافت رویداد دوبار کلیک موس ارائه دادند، دقیقا" یادم نیست ولی احتمالا" در تاپیک زیر بود:
http://barnamenevis.org/showthread.php?294814-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D9%85%D8%A7%DA%A9%D8%B1%D9%88&p=1296472&viewfull=1#post1296472

موفق باشید

setroyd
جمعه 25 شهریور 1390, 11:01 صبح
این کلیدهارو پشت سرهم میگیره . ولی در مورد اینکه اگر یک کلید رو گرفتید همون یکبار نوشته شود اون رو میشه با همین کد پیاده کرد حالا برات کد میزارم اینم رو سیستم داشتم دیگه ننوشتم یه تست کردم دیدم کار میکنه گفتم برات بزارم . ولی برای رویدادها هم برات کد مینویسم میزارم . موفق باشی

just4froum
جمعه 25 شهریور 1390, 11:14 صبح
جناب setroyd (http://barnamenevis.org/member.php?183390-setroyd) از شما بسیار سپاسگذارم این دقیقا همون چیزی بود که می خواستم.

just4froum
جمعه 25 شهریور 1390, 11:40 صبح
من مشکلمو فهمیدم :

مشکل من این بود که GetAsyncKeyState(x) رو برابر با -32768 قرار میدادم که با قرار دادن برابر -32767 درست شد.

حالا کسی دقیقا می دونه این اعداد چی هستن ؟

ali190
جمعه 25 شهریور 1390, 11:50 صبح
سلام
آیا امکانش هست در key logger کاراکترهای فارسی رو برگردوند؟

setroyd
جمعه 25 شهریور 1390, 12:31 عصر
بله امکانش هست چون کار این تابع فقط برگرداندن کد کاراکتر زده شده توسط کیبورد هست که ما اون رو به کاراکتر تبدیل میکنیم پس 100 عملی هست .

محسن واژدی
جمعه 25 شهریور 1390, 12:46 عصر
من مشکلمو فهمیدم :

مشکل من این بود که GetAsyncKeyState(x) رو برابر با -32768 قرار میدادم که با قرار دادن برابر -32767 درست شد.

حالا کسی دقیقا می دونه این اعداد چی هستن ؟


مقادیر -32768و -32767 وضعیت Up و Down بودن کلید را مشخص میکند

موفق باشید