PDA

View Full Version : در مورد hot key مثلا برای ماشین حساب برنامه...



alilittle
جمعه 07 اسفند 1383, 10:07 صبح
می خواستم داخل برنامه با فشرده شدن کلید خاصی مثل F1 فرمی لود بشه مثل ماشین حساب .
مستقل از اینکه کاربر در حال حاضر در چه فرمی قرار داره.
میشه روش این کارو به من بفرمایین . ممنون میشم . :oops:

Hamedm
جمعه 07 اسفند 1383, 11:12 صبح
سلام

سوالتون تکراری است.
اگه منظورت اینکه توی Windows میخواهی کلید خاصی رو به برنامه خودت اختصاص بدی باید از یکی از دو روش زیر عمل کنی:

۱ - استفاده از یک تابع کتابخانه ای به اسم 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
برای مشاهده یک برنامه نمونه به آدرس زیر مراجعه کنید .
http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=36078&lngWId=1

۲ - استفاده از قلاب یا 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 فرستاد .

برای دیدن نمونه و اطلاعات بیشتر میتونید به آدرس زیر مراجعه کنید.
http://www.mentalis.org/apilist/SetWindowsHookEx.shtml

موفق باشید و پرتوان :موفق:

حامد مصافی
شنبه 08 اسفند 1383, 00:56 صبح
سلام
جناب حامد خان اگر از یک تایمر برای بررسی کلید های فشار داده شده استفاده کنیم باعث کند شدن برنامه خواهد شد و اگر برای رویداد های صفحه کلید هوک تعریف کنیم باعث می شود تا ویندوز در هر بار فشار داده شدن کلید های صفحه کلید کد برنامه شما را نیز اجرا کند
بهترین راه برای انجام این کار تعریف یک Shortcut برای یک پنجره است ؛ به این ترتیب هر وقت کلید های مربوطه فشار داده شود ویندوز پنجره مربوطه را مطلع خواهد ساخت که با بررسی پروسس پنجره می توان به فشرده شدن کلید های مربوطه پی برد
و اما نحوه انجام این کار:

تعریف یک شورت کات



Public Enum ModConst
MOD_ALT = &H1
MOD_CONTROL = &H2
MOD_SHIFT = &H4
End Enum

Private Declare Function RegisterHotKey Lib "user32" ( _
ByVal hwnd As Long, _
ByVal id As Long, _
ByVal fsModifiers As Long, _
ByVal vk As Long) As Long


hwnd هندل پنجره مربوطه
id آی دی شورت کات ( از 0 تا 3071 )
fsMdifiers یکی از کلید های کنترلی
MOD_ALT = &H1
MOD_CONTROL = &H2
MOD_SHIFT = &H4

vk کد اسکی کلید مورد نظر


بررسی فشرده شدن شورت کات:
ابتدا تابع زیر را تعریف می کنیم



Private Const GWL_WNDPROC = -4
Private Declare Function SetWindowLongA Lib "user32" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long


حال وقایع مربوط به فرم را در تابعی به نام WndProc بررسی می کنیم


Dim oldProc As Long
oldProc = SetWindowLongA(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)


تابع WndProc را اینگونه تعریف کنید:


Public Function WndProc(ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

' بررسی فشرده شدن شورت کات در اینجا انجام می پذیرد
End Function



یک نمونه از بررسی کلید فشار داده شده که در تابع WndProc باید نوشته شود ( توجه : خط آخر الزامی است )


WndProc = 0
If uMsg = WM_HOTKEY Then
If wParam = 1 Then
MsgBox "The Hotkey pressed"
End If
End If
WndProc = CallWindowProcA(oldProc, hwnd, uMsg, wParam, lParam)


نحوه برداشتن شورت کات با تابع زیر صورت می گیرد


Private Declare Function UnRegisterHotKey Lib "user32" ( _
ByVal hwnd As Long, _
ByVal id As Long) As Long


در صورت نیاز بفرمایید تا یک نمونه برایتان بنویسم

Hamedm
شنبه 08 اسفند 1383, 07:32 صبح
BlackDal جان میشه در مورد تابع SetWindowLongA توضیح بدی؟

ممنون :flower: :flower:

حامد مصافی
شنبه 08 اسفند 1383, 10:47 صبح
سلام
البته

همانطور که می دانید هر پنجره خصوصیاتی مربوط به خود دارد که این خصوصیات در 64 بیت ذخیره می شوند ( 32 بیت خصوصیات عادی و 32 بیت خصوصیات بسط یافته ) از تابع SetWindowLongA ( که نمونه 32 بیتی تابع SetWindowLong است ) برای تغییر این خصوصیات استفاده می شود و صورت ان به این شکل است :


Const GWL_EXSTYLE = -20 ' خصوصیات بسط یافته
Const GWL_WNDPROC = -4 ' پردازش هایی که روی پنجره صورت می گیرد
Const GWL_STYLE = -16 ' خصوصیات عادی پنجره

Private Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" ( _
ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long


hwnd : هندل پنجره مورد نظر است
nIndex : مشخص می کند قصد تغییر کدام خصوصیات پنجره را دارید ( از ثابت هایی که در کد نوشتم استفاده کنید )
dwNewLong : خصوصیات جدید پنجره است ( توجه کنید من در این متغیر از آدرس یک تابع استفاده کرده ام که این موضوع باعث می شود تا ویندوز در هر بار مقدار دهی خصوصیات پنجره تابع مزبور را فراخوانی کند ( نوعی هوک )

Hamedm
شنبه 08 اسفند 1383, 12:55 عصر
BlackDal جان ممنون :flower: :flower: :flower:

alilittle
شنبه 08 اسفند 1383, 21:48 عصر
از لطف شما دو دوست عزیز ممنونم. :oops:

sadegi
یک شنبه 09 اسفند 1383, 00:11 صبح
ار دوستان خیلی ممنون
ما هم استفاده کردیم :flower: :flower:

sadegi
یک شنبه 09 اسفند 1383, 00:12 صبح
ار دوستان خیلی ممنون
ما هم استفاده کردیم :flower: :flower:

sadegi
یک شنبه 09 اسفند 1383, 00:13 صبح
ار دوستان خیلی ممنون
ما هم استفاده کردیم :flower: :flower:

KING_TESLA
پنج شنبه 07 مرداد 1389, 13:43 عصر
من وی بی بلد نیستم میشه یه برنامه کوچیک بنویسید یا توزیح بدین که مثلا با زدن یه دکمه ی تیمر 1ک به کار بیوفته