hungpecc1
Thành viên gắn bó



- Tham gia
- 24/8/12
- Bài viết
- 1,709
- Được thích
- 2,304
- Giới tính
- Nam
Chúc tất cả thành viên GPE một buổi sáng tốt lành !
Hôm qua em có mày mò viết code Hook cho keyboard như sau:
Code trong moudle :
sau đó tạo 1 form có tên là frmMain và một cmd button ; code trong form như sau:
Vân đề em gặp lỗi ở đây là :
* Nếu goi thủ tục Sub main từ form FrmMain --> thì không nhận được bất kỳ sự kiện nào khi nhấn 1 phím từ keyboard
** Nếu gọi thủ tục trực tiếp là subMain ( Project Property : chọn sub Main() ) thì code trên ok !
Như vậy là do code của em sai, hay là thiếu sót chỗ nào ? mong các thành viên GPE giải thích cho mình hiểu rõ hơn !
Cảm ơn !
Hôm qua em có mày mò viết code Hook cho keyboard như sau:
Code trong moudle :
Mã:
Option Explicit
Public hKbdHook As Long
Private Const WH_KEYBOARD_LL As Integer = 13
Private Const HC_ACTION As Integer = 0
Private Const WM_KEYDOWN As Long = &H100
Private Const WM_KEYUP As Long = &H101
Private Type KBDLLHOOKSTRUCT
vkCode As Integer
scanCode As Integer
flags As Integer
time As Integer
dwExtraInfo As Integer
End Type
Private 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
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Integer
Dim kbdllhs As KBDLLHOOKSTRUCT
CopyMemory kbdllhs, ByVal lParam, Len(kbdllhs)
If nCode = HC_ACTION Then
LowLevelKeyboardProc = CallNextHookEx(hKbdHook, nCode, wParam, lParam)
Select Case wParam
Case WM_KEYDOWN
[B][COLOR=#b22222] If kbdllhs.vkCode = 13 Then[/COLOR][/B]
[B][COLOR=#b22222] FrmMain.Show[/COLOR][/B]
[B][COLOR=#b22222] Else[/COLOR][/B]
[B][COLOR=#b22222] FrmMain.Hide[/COLOR][/B]
[B][COLOR=#b22222] End If[/COLOR][/B]
Case WM_KEYUP
End Select
Else: LowLevelKeyboardProc = CallNextHookEx(hKbdHook, nCode, wParam, lParam)
End If
End Function
Sub Main()
hKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0&)
If hKbdHook = 0 Then
MsgBox "Initialisation of keyboard hook failed.", vbCritical, "Keyboard Hook"
Exit Sub
End If
[COLOR=#ff0000][B] FrmMain.Hide[/B][/COLOR]
End Sub
sau đó tạo 1 form có tên là frmMain và một cmd button ; code trong form như sau:
Mã:
Private Sub Form_Unload(Cancel As Integer)
Call UnhookWindowsHookEx(hKbdHook)
End Sub
'--------------------------
Private Sub Command1_Click()
[COLOR=#ff0000][B]Call Main[/B][/COLOR]
End Sub
Vân đề em gặp lỗi ở đây là :
* Nếu goi thủ tục Sub main từ form FrmMain --> thì không nhận được bất kỳ sự kiện nào khi nhấn 1 phím từ keyboard
** Nếu gọi thủ tục trực tiếp là subMain ( Project Property : chọn sub Main() ) thì code trên ok !
Như vậy là do code của em sai, hay là thiếu sót chỗ nào ? mong các thành viên GPE giải thích cho mình hiểu rõ hơn !
Cảm ơn !