ورود

View Full Version : سوال: صدور یک پیغام با فشار دادن کلید های ترکیبی windows+d



nazanin_90
دوشنبه 15 آبان 1391, 19:40 عصر
سلام
میخواهم وقتی کلید های ترکیبی windows+d که منجر به مینیمایز شدن پنجره برنامه میشود را همزمان فشار دادم رخداد مینیمایز کنسل و بجای آن یک رخداد دیگر مثلاً صدور یک پیغام انجام شود .
با تشکر

مهرداد صفا
سه شنبه 16 آبان 1391, 17:23 عصر
با سلام
ابتدا یک Hook برای دریافت رویدادهای پیامهای کیبورد ایجاد میکنیم، سپس درون تابع CallBackکلیدها را چک میکنیم و در صورت لزوم میتوانیم به جای CallNextHookEx مقدار -1 را برگردانیم تا کلید منتقل و اجرا نشود. به این صورت:

'in the name of god
'اللهم صل علی محمد و آله
'کد درون ماجول

Option Explicit
Private Type KBHOOKSTRUCT
vkCode As Long
dscanCode As Long
flags As Long
time As Long
dwExtraInfo As Long
End Type

Public Const WH_KEYBOARD_LL = 13
Public Const WM_KEYDOWN = &H100
Public Const WM_SYSKEYDOWN = &H104
Public Const WM_KEYUP = &H101
Public Const WM_SYSKEYUP = &H105
Public Const HC_ACTION = 0
Public Const vbKeyLWin As Integer = 91
Public Const vbKeyRWin As Integer = 92

Public 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
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal HHook As Long) As Long
Public Declare Function CallNextHookEx Lib "user32" (ByVal HHook As Long, ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

Public HookHW As Long

Public Function LowLevelKeyboardProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim kybd As KBHOOKSTRUCT
If code = HC_ACTION And wparam =wm_keydown or wparam =wm_syskeydown or wparam=wm_Keyup or wParam =wm_SysKeyup then
CopyMemory kybd, ByVal lParam, Len(kybd)
If kybd.vkCode = vbKeyD And ((GetKeyState(vbKeyRWin) And &HF0000000) Or (GetKeyState(vbKeyLWin) And &HF0000000)) Then
'exit the function with out calling the nextHook
LowLevelKeyboardProc = -1
Beep
Exit Function
End If
end if

LowLevelKeyboardProc = CallNextHookEx(HookHW, code, wParam, lParam)
End Function

'کد درون فرم


Private Sub Form_Load()
Me.WindowState = 2
HookHW = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)

End Sub

Private Sub Form_Unload(Cancel As Integer)
UnhookWindowsHookEx HookHW

End Sub

nazanin_90
سه شنبه 16 آبان 1391, 18:12 عصر
باسلام
ممنون از پاسختون
فقط یک مشکل ، درحالت KeyUp(بالا آمدن کلید Windows) استارت منو ویندوز ظاهر میشود ؛ برای جلوگیری از این کار چه باید کرد ؟
باتشکر

nazanin_90
چهارشنبه 17 آبان 1391, 19:20 عصر
سلام
درلینک زیر مراحلی بصورت دستی برای غیر فعال کردن کلید ویندوز توضیح داده شده ؛ آیا انجام این مراحل بصورت کد وی بی میتوان تبدیل کرد ؟
http://www.doniya.ir/show-4042.html
با تشکر

مهرداد صفا
چهارشنبه 17 آبان 1391, 20:23 عصر
باسلام
ممنون از پاسختون
فقط یک مشکل ، درحالت KeyUp(بالا آمدن کلید Windows) استارت منو ویندوز ظاهر میشود ؛ برای جلوگیری از این کار چه باید کرد ؟
باتشکر
سلام
خواهش میکنم.
در صورت لزوم میتوانید کلید استارت را هم غیر فعال کنید؛ برای این کار کد مربوط به تابع LowLevelKeyBoardProc را به صورت زیر تغییر دهید:

Public Function LowLevelKeyboardProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim kybd As KBHOOKSTRUCT
If code = HC_ACTION And wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN Or wParam = WM_KEYUP Or wParam = WM_SYSKEYUP Then
CopyMemory kybd, ByVal lParam, Len(kybd)
If kybd.vkCode = vbKeyD And ((GetKeyState(vbKeyRWin) And &HF0000000) Or (GetKeyState(VbKeyLWin) And &HF0000000)) Then
'exit the function with out calling the nextHook
LowLevelKeyboardProc = 1
Beep
Exit Function

ElseIf (kybd.vkCode = VbKeyLWin Or kybd.vkCode = vbKeyRWin) And GetActiveWindow = Form1.hWnd Then
LowLevelKeyboardProc = 1
Beep
Exit Function

End If
End If
LowLevelKeyboardProc = CallNextHookEx(HookHW, code, wParam, lParam)
End Function

در استفاده از hook خیلی دقت کنید.

مهرداد صفا
چهارشنبه 17 آبان 1391, 21:06 عصر
سلام
درلینک زیر مراحلی بصورت دستی برای غیر فعال کردن کلید ویندوز توضیح داده شده ؛ آیا انجام این مراحل بصورت کد وی بی میتوان تبدیل کرد ؟
http://www.doniya.ir/show-4042.html
با تشکر
اگر اشتباه نکنم غالبا تغییرات از این دست در کلید های رجیستری مستلزم ریستارت برای اعمال تغییرات وارده است از این گذشته به نظر من احتمال بسته شدن غیر عادی برنامه بر اثر خطاها یا ... وجود دارد که ممکن است قبل از اینکه تغییرات را به حالت قبل برگردانید این اتفاق بیفتد و باعث اختلال در کار کاربر شود.
اگر پست بالا کمکی نکرد راههای دیگری هم برای غیر فعال کردن موقت کلید استارت هست که هر چند کاملا اصولی نباشند ولی عملی هستند.

nazanin_90
پنج شنبه 18 آبان 1391, 17:46 عصر
اگر پست بالا کمکی نکرد راههای دیگری هم برای غیر فعال کردن موقت کلید استارت هست که هر چند کاملا اصولی نباشند ولی عملی هستند.
بازممنون جناب M.safa !
مشکل حل شد،ولی بازهم کنجکاو شدم که راههای دیگر برای غیر فعال کردن موقت کلید استارت چه هستند؟
باتشکر

مهرداد صفا
جمعه 19 آبان 1391, 22:48 عصر
بازممنون جناب M.safa !
مشکل حل شد،ولی بازهم کنجکاو شدم که راههای دیگر برای غیر فعال کردن موقت کلید استارت چه هستند؟
باتشکر
سلام خواهش میکنم.
میتوانید در یک حلقه یا تایمر پنجره مربوط به منوی استارت را پیدا کرده و ببندید و پنجره مربوط به فرم اصلی را فعال کنی.