home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 7_2009-2012.ISO / data / zips / global_key217233192010.psc / GFGlobalKeyHookmod.bas < prev   
BASIC Source File  |  2004-01-07  |  8KB  |  184 lines

  1. Attribute VB_Name = "GFGlobalKeyHookmod"
  2. Option Explicit
  3. '(c)2001, 2004 by Louis. Use to set up a global key hook to allow a target project to use hot keys.
  4. 'Code partially copied from NN99 (06.01.04).
  5. '
  6. 'Interface sub (copy to target form):
  7. 'Public Sub GFGlobalKeyHookProc(ByVal SourceDescription As String, ByVal KeyCode As Integer, ByVal Shift As Integer, ByRef ReturnValueUsedFlag As Boolean, ByRef ReturnValue As Long)
  8. '    'on error resume next
  9. 'End Sub
  10. '
  11. 'NOTE: the target project must define and process hot keys.
  12. 'Also informing the user about hot keys is the task of the target project.
  13. 'It is recommended to use a sub called 'DefineHotKeys' for defining
  14. 'the hot keys at program start up.
  15. '
  16. 'NN99 CODE >>>
  17. '(c)1999, 2000 by daynight.
  18. 'NOTE: parts of code have been copied to the KeyHook Sonde File project (04-16-2000).
  19. '[Set/Remove]KeyHook
  20. Declare Sub SetKH Lib "GFGKH.dll" Alias "noname_sub001" (ByVal MsgTargetAddress As Long, ByVal HookDLLName As String)
  21. Declare Sub RemoveKH Lib "GFGKH.dll" Alias "noname_sub002" ()
  22. 'KeyHookProcSub
  23. Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal nVirtKey As Long) As Integer
  24. '[Set/Remove]MessageHook
  25. Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  26. Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  27. Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
  28. Private Declare Function FreeLibrary Lib "kernel32.dll" (ByVal hLibModule As Long) As Long
  29. '<<< END OF NN99 CODE
  30. 'GFGlobalKeyHookStruct
  31. Private Type GFGlobalKeyHookStruct
  32.     KeyHookEnabledFlag As Boolean
  33.     KeyHookTargetFormName As String
  34.     KeyHookTargetForm As Object
  35. End Type
  36. Dim GFGlobalKeyHookStructNumber As Integer
  37. Dim GFGlobalKeyHookStructArray() As GFGlobalKeyHookStruct
  38. 'other
  39. Dim KeyHookEnabledFlag As Boolean 'if key hook has been set up once
  40. Dim KeyHookHandle As Long
  41. 'old NN99 code
  42. Dim MessageHookEnabledFlag As Boolean
  43. Dim MessageHookKHhWndUnchanged As Long
  44. Dim MessageHookhWndUnchanged As Long
  45. Dim HookDLLHandle As Long
  46.  
  47. Public Sub GFGlobalKeyHook_SetKeyHook(ByVal KeyHookTargetFormName As String, ByRef KeyHookTargetForm As Object)
  48.     'on error Resume Next 'add another form to the KeyHook target form buffer
  49.     Dim StructIndex As Integer
  50.     Dim StructLoop As Integer
  51.     '
  52.     'NOTE: call this sub to set a form into the 'key hook event notification queue'.
  53.     'Call [...]_RemoveKeyHook to remove the form again.
  54.     'The key hook itself will not be removed until GFGlobalKeyHook_Terminate is called.
  55.     '
  56.     'preset
  57.     StructIndex = 0 'reset (error)
  58.     For StructLoop = 1 To GFGlobalKeyHookStructNumber
  59.         If GFGlobalKeyHookStructArray(StructLoop).KeyHookTargetFormName = KeyHookTargetFormName Then
  60.             StructIndex = StructLoop
  61.             Exit For
  62.         End If
  63.     Next StructLoop
  64.     'begin
  65.     If StructIndex = 0 Then
  66.         'create new array element to add target form
  67.         If Not (GFGlobalKeyHookStructNumber = 32766) Then 'verify
  68.             GFGlobalKeyHookStructNumber = GFGlobalKeyHookStructNumber + 1
  69.         Else
  70.             MsgBox "internal error in GFGlobalKeyHook_SetKeyHook(): overflow !", vbOKOnly + vbExclamation 'damn it!
  71.             Exit Sub 'error
  72.         End If
  73.         ReDim Preserve GFGlobalKeyHookStructArray(1 To GFGlobalKeyHookStructNumber) As GFGlobalKeyHookStruct
  74.         GFGlobalKeyHookStructArray(GFGlobalKeyHookStructNumber).KeyHookEnabledFlag = True
  75.         GFGlobalKeyHookStructArray(GFGlobalKeyHookStructNumber).KeyHookTargetFormName = KeyHookTargetFormName
  76.         Set GFGlobalKeyHookStructArray(GFGlobalKeyHookStructNumber).KeyHookTargetForm = KeyHookTargetForm
  77.         'enable key hook if not done yet
  78.         If KeyHookEnabledFlag = False Then
  79.             Call SetMessageHook(KeyHookTargetForm.KH)
  80.             Call SetKeyHook(KeyHookTargetForm.KH)
  81.             KeyHookEnabledFlag = True 'do here as RemoveKH also alters KeyHookEnabledFlag
  82.         End If
  83.     Else
  84.         'add target form
  85.         GFGlobalKeyHookStructArray(GFGlobalKeyHookStructNumber).KeyHookEnabledFlag = True
  86.         GFGlobalKeyHookStructArray(GFGlobalKeyHookStructNumber).KeyHookTargetFormName = KeyHookTargetFormName 'senseless
  87.         Set GFGlobalKeyHookStructArray(GFGlobalKeyHookStructNumber).KeyHookTargetForm = KeyHookTargetForm
  88.     End If
  89.     Exit Sub
  90. End Sub
  91.     
  92. Public Sub GFGlobalKeyHook_RemoveKeyHook(ByVal KeyHookTargetFormName As String, ByRef KeyHookTargetForm As Object)
  93.     'on error Resume Next 'call to prevent a target form from receiving messages (call [...]_SetKeyHook() to enable message receiving again)
  94.     Dim StructIndex As Integer
  95.     Dim StructLoop As Integer
  96.     'preset
  97.     StructIndex = 0 'reset (error)
  98.     For StructLoop = 1 To GFGlobalKeyHookStructNumber
  99.         If GFGlobalKeyHookStructArray(StructLoop).KeyHookTargetFormName = KeyHookTargetFormName Then
  100.             StructIndex = StructLoop
  101.             Exit For
  102.         End If
  103.     Next StructLoop
  104.     'begin
  105.     If Not (StructIndex = 0) Then 'verify
  106.         GFGlobalKeyHookStructArray(StructIndex).KeyHookEnabledFlag = False
  107.     End If
  108. End Sub
  109.  
  110. Public Sub GFGlobalKeyHook_Terminate()
  111.     'on error Resume Next 'call when unloading target project
  112.     If KeyHookEnabledFlag = True Then
  113.         Call RemoveKH
  114.         Call RemoveMessageHook
  115.         KeyHookEnabledFlag = False 'reset (do here as RemoveKH also alters KeyHookEnabledFlag)
  116.     End If
  117. End Sub
  118.  
  119. Public Function GFGlobalKeyHook_KeyHookProc(ByVal KeyCode As Long, ByVal KeyModifierCode As Long) As Long
  120.     'on error Resume Next 'code mainly copied from NN99
  121.     Dim ReturnValueUsedFlag As Boolean
  122.     Dim ReturnValue As Long
  123.     Dim Shift As Integer
  124.     Dim StructLoop As Integer
  125.     'begin
  126.     For StructLoop = 1 To GFGlobalKeyHookStructNumber
  127.         Call GFGlobalKeyHookStructArray(StructLoop).KeyHookTargetForm.GFGlobalKeyHookProc( _
  128.             GFGlobalKeyHookStructArray(StructLoop).KeyHookTargetFormName, KeyCode, CInt(KeyModifierCode), ReturnValueUsedFlag, ReturnValue)
  129.     Next StructLoop
  130. End Function
  131.  
  132. '***NN99 CODE***
  133. 'NOTE: the following code has been copied from NN99 (06.01.04) and altered.
  134.  
  135. Public Sub SetKeyHook(ByRef KH As PictureBox)
  136.     'On Error Resume Next
  137.     If KeyHookEnabledFlag = False Then
  138.         KeyHookEnabledFlag = True
  139.         HookDLLHandle = LoadLibrary("GFGKH.dll")
  140.         Call SetKH(KH.hWnd, "GFGKH.dll")
  141.     End If
  142. End Sub
  143.  
  144. Public Sub RemoveKeyHook()
  145.     'On Error Resume Next
  146.     If KeyHookEnabledFlag = True Then
  147.         KeyHookEnabledFlag = False 'reset
  148.         Call RemoveKH
  149.         Call FreeLibrary(HookDLLHandle)
  150.     End If
  151. End Sub
  152.  
  153. Public Sub SetMessageHook(ByRef KH As PictureBox)
  154.     'On Error Resume Next
  155.     If MessageHookEnabledFlag = False Then
  156.         MessageHookEnabledFlag = True
  157.         MessageHookKHhWndUnchanged = KH.hWnd 'store current handle (used also in RemoveMessageHook)
  158.         MessageHookhWndUnchanged = SetWindowLong(MessageHookKHhWndUnchanged, (-4), AddressOf MessageHookProcSub)
  159.     End If
  160. End Sub
  161.  
  162. Public Sub RemoveMessageHook()
  163.     'On Error Resume Next
  164.     If MessageHookEnabledFlag = True Then
  165.         MessageHookEnabledFlag = False 'reset
  166.         Call SetWindowLong(MessageHookKHhWndUnchanged, (-4), MessageHookhWndUnchanged)
  167.     End If
  168. End Sub
  169.  
  170. Public Function MessageHookProcSub(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  171.     'On Error Resume Next
  172.     Select Case Msg
  173.     Case 0 'NULL message
  174.         If Not ((GetAsyncKeyState(wParam) And &H8001) = 0) Then 'check for keydown event
  175.             Call GFGlobalKeyHook_KeyHookProc(wParam, lParam)
  176.         End If
  177.     End Select
  178.     MessageHookProcSub = CallWindowProc(MessageHookhWndUnchanged, hWnd, Msg, wParam, lParam)
  179. End Function
  180.  
  181. '***END OF NN99 CODE***
  182. '***END OF MODULE***
  183.  
  184.