چطور میشه توسط ویژوال بیسیک فشرده شدن دکمه صفحه کلید رو تشخیص داد البته منظورم موقعی هستش که فوکس رو برنامه مون نباشه
Printable View
چطور میشه توسط ویژوال بیسیک فشرده شدن دکمه صفحه کلید رو تشخیص داد البته منظورم موقعی هستش که فوکس رو برنامه مون نباشه
با استفاده از توابع API و ارتباط برقرار کردن با توابع هسته ویندوز .نقل قول:
تابع GetKeyboardState در قالب یک آرایه وضعیت تمام دکمه های صفحه کلید را در قالب یک آرایه در لحظه فراخوانی به برنامه شما بازمیگرداند .
کد:
VERSION 5.00
Begin VB.Form Form1
Caption = "Project_272"
ClientHeight = 3195
ClientLeft = 60
ClientTop = 345
ClientWidth = 4680
LinkTopic = "Form1"
ScaleHeight = 3195
ScaleWidth = 4680
StartUpPosition = 3 'Windows Default
Begin VB.TextBox Text1
Height = 495
Left = 720
TabIndex = 0
Text = "Text1"
Top = 720
Width = 2055
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Const VK_A = &H41
Private Const VK_B = &H42
Private Const VK_C = &H43
Private Const VK_D = &H44
Private Const VK_E = &H45
Private Const VK_F = &H46
Private Const VK_G = &H47
Private Const VK_H = &H48
Private Const VK_I = &H49
Private Const VK_J = &H4A
Private Const VK_K = &H4B
Private Const VK_L = &H4C
Private Const VK_M = &H4D
Private Const VK_N = &H4E
Private Const VK_O = &H4F
Private Const VK_P = &H50
Private Const VK_Q = &H51
Private Const VK_R = &H52
Private Const VK_S = &H53
Private Const VK_T = &H54
Private Const VK_U = &H55
Private Const VK_V = &H56
Private Const VK_W = &H57
Private Const VK_X = &H58
Private Const VK_Y = &H59
Private Const VK_Z = &H5A
کد:
Private Const VK_CAPITAL = &H14
Private Const VK_NUMLOCK = &H90
Private Const VK_SCROLL = &H91
Private Const VK_USED = VK_SCROLL
Private Type KeyboardBytes
kbByte(0 To 255) As Byte
End Type
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Long
Private Declare Function GetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long
Private Declare Function SetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim kbArray As KeyboardBytes, CapsLock As Boolean, kbOld As KeyboardBytes
Private Sub Form_Load()
GetKeyboardState kbOld
Me.Hide
MsgBox "Keep your eyes on the little num-, shift- and scrolllock lights on the keyboard."
TurnOff VK_CAPITAL
TurnOff VK_NUMLOCK
TurnOff VK_SCROLL
Sleep 1000
TurnOn VK_NUMLOCK
Sleep 100
TurnOn VK_CAPITAL
Sleep 100
TurnOn VK_SCROLL
Sleep 300
TurnOff VK_NUMLOCK
Sleep 100
TurnOff VK_CAPITAL
Sleep 100
TurnOff VK_SCROLL
Sleep 500
TurnOn VK_NUMLOCK
TurnOn VK_SCROLL
Sleep 200
TurnOff VK_NUMLOCK
TurnOff VK_SCROLL
Sleep 200
TurnOn VK_NUMLOCK
TurnOn VK_SCROLL
Sleep 200
TurnOff VK_NUMLOCK
TurnOff VK_SCROLL
Sleep 200
TurnOn VK_CAPITAL
Sleep 200
TurnOff VK_CAPITAL
Sleep 200
TurnOn VK_CAPITAL
Sleep 200
TurnOff VK_CAPITAL
Sleep 200
TurnOn VK_NUMLOCK
TurnOn VK_SCROLL
Sleep 200
TurnOff VK_NUMLOCK
TurnOff VK_SCROLL
Sleep 200
TurnOn VK_NUMLOCK
TurnOn VK_SCROLL
Sleep 200
TurnOff VK_NUMLOCK
TurnOff VK_SCROLL
Sleep 200
TurnOn VK_CAPITAL
Sleep 400
TurnOff VK_CAPITAL
Sleep 200
TurnOn VK_NUMLOCK
Sleep 100
TurnOn VK_CAPITAL
Sleep 100
TurnOn VK_SCROLL
Sleep 300
TurnOff VK_SCROLL
Sleep 100
TurnOff VK_CAPITAL
Sleep 100
TurnOff VK_NUMLOCK
Sleep 1000
End Sub
Private Sub TurnOn(vkKey As Long)
GetKeyboardState kbArray
kbArray.kbByte(vkKey) = 1
SetKeyboardState kbArray
End Sub
Private Sub TurnOff(vkKey As Long)
GetKeyboardState kbArray
kbArray.kbByte(vkKey) = 0
SetKeyboardState kbArray
End Sub
Private Sub Form_Unload(Cancel As Integer)
SetKeyboardState kbOld
End Sub
مثال
کد:
http://s8.picofile.com/file/8339332250/GetKeyboardState.zip.html
از دیگر توابع Api که ممکن است در راستای هدف شما مفید باشد :
تابع RegisterHotkey
هدف : این تابع یک کلید یا کلیدی ترکیبی را در محیط ویندوز ثبت می کند.
کلیدی که توسط این تابع تعریف می شود درون قسمتی از حافظه قرار می گیرد و در هرجای ویندوز که کلید تعریف شده فشرده شود،
برنامه شما در صورت فعال بودن عکس العمل نشان خواهد داد.
سیستم عامل : ویندوز 95 به بعد ؛ ویندوز NT3.1 به بعد
مبدا فراخوانی : user32
مقادیر بازگشتی : مقدار صفر به منزله عدم موفقیت تابع می باشد و مقادیر غیرصفر موفقیت آن را می رساند.
توضیح :
1.hwnd: اشاره گر پنجره فرم و یا اجزای داخل فرم می باشد که می خواهیم کلید ها برای آن ثبت شوند.
2.id: کد هویت آن hotkey می باشد که میتواند بین &H0000& و &HBFF& باشد. (در مبنای Hex)
3.fsModifiers: مقدار این متغیر می تواند با کلید تعریف شده در متغییر VK ترکیب شوند ، که این مقادیر میتوانند از موارد زیر باشند:MOD_Alt: کلید Alt فشار داده شده است.
MOD_control: کلید Ctrl فشرده شده است.
MOD_shift: کلید Shift فشار داده شده است.
4.VK: مقدار این متغیر که کلیدهای طبیعی ویندوز می باشند مانند VbkeYM (کلید M) ، VbkeYP (کلید P) الی آخر.
توجه:
1.هر یک از مقادیر متغییر FsMoidifiers می توانند به کمک دستور or با یکدیگر ترکیب شوند.
2.مقادیر متغییر VK نمی توانند با یکدیگر ترکیب شوند.
3.بعد از استفاده از RegisterHotkey ، از تابع UnRegisterHotkey جهت خارج کردن کلید ها از رزرو استفاده کنید.
4.تابع WaitMessage باعث می شود سیستم منتظر ارسال چیزی بماند و وقتی چیزی به پنجره ، فرم یا اجزای فرم ارسال شد ، تابع PeekMessage بررسی می کند که آیا مورد ارسال شده (در این مثال Hotkey) با مقدار متغییر vMsgFilterMin (در این مثال WM_Hotkey) برابر است یا خیر و در صورت برابر بودن مقدار True را برمی گرداند.
مثال:
کد:
Private Const MOD_ALT = &H1
Private Const MOD_CONTROL = &H2
Private Const MOD_SHIFT = &H4
Private Const MOD_LEFT = &H8000
Private Const MOD_RIGHT = &H4000
Private Const MOD_WIN = &H8
Private Const PM_REMOVE = &H1
Private Const WM_HOTKEY = &H312
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type Msg
hWnd As Long
Message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type
Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As Msg, ByVal hWnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
Private Declare Function WaitMessage Lib "user32" () As Long
Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Private Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long) As Long
Private Isnot As Boolean
Private Sub ProcessMessages()
Dim Message As Msg
Do While Not Isnot
WaitMessage
If PeekMessage(Message, Me.hWnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then
WindowState = vbMinimized
End If
DoEvents
Loop
End Sub
Private Sub Form_Load()
Dim Retval As Long
Isnot = False
Retval = RegisterHotKey(Me.hWnd, &HBFFF&, MOD_ALT, vbKeyZ)
Me.AutoRedraw = True
Me.Print "Press Alt-Z to minimize this form"
Show
ProcessMessages
End Sub
Private Sub Form_Unload(Cancel As Integer)
Isnot = True
UnregisterHotKey Me.hWnd, &HBFFF&
End Sub
کد:
http://s8.picofile.com/file/8339336442/RegisterHotKey.zip.html