derekburleigh
New member
- Local time
- Today, 19:18
- Joined
- May 16, 2011
- Messages
- 14
I have an access database running on 32 bit Office quite happily, it uses MouseHook.dll to enable/disable the mousewheel.
I am trying to convert the database to run on both 32 bit and 64 bit Office, as some of my users are using 64 bit Office.
I have done all the usual stuff (Added PtrSafe to "Declare" statements and changed all handles to LongPtr).
I cannot get MouseHook to work on Office 64 bit however. I have it in the same folder as the database, also added it into System32 and SysWOW64 folders just in case!
Whatever I do I always get a message saying "Sorry....cannot find the MouseHook.dll file".
Some forums suggest registering the .dll with regsvr32, but this doesn't work with error message "The module "MouseHook.dll" may not be compatible with the version of Windows that you are running."
The error in Access is coming from the MouseWheel code that I have copied from the example database supplied with the download. In fact, I get the same error if I try and run the example database!
These are the changes I have done to the code to get it to run on 64 bit Access, anyone see any problems? I have tried it with various combinations of "Long" and "LongPtr":
Option Compare Database
Option Explicit
Private Declare PtrSafe Function LoadLibrary Lib "kernel32" _
Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr
Private Declare PtrSafe Function FreeLibrary Lib "kernel32" _
(ByVal hLibModule As LongPtr) As LongPtr
Private Declare PtrSafe Function StopMouseWheel Lib "MouseHook" _
(ByVal hWnd As LongPtr, ByVal AccessThreadID As LongPtr, _
Optional ByVal bNoSubformScroll As Boolean = False, Optional ByVal blIsGlobal As Boolean = False) As Boolean
Private Declare PtrSafe Function StartMouseWheel Lib "MouseHook" _
(ByVal hWnd As LongPtr) As Boolean
Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As LongPtr
' Instance returned from LoadLibrary call
Private hLib As LongPtr
Public Function MouseWheelON() As Boolean
MouseWheelON = StartMouseWheel(Application.hWndAccessApp)
If hLib <> 0 Then
hLib = FreeLibrary(hLib)
End If
End Function
Public Function MouseWheelOFF(Optional NoSubFormScroll As Boolean = False, Optional GlobalHook As Boolean = False) As Boolean
Dim s As String
Dim blRet As Boolean
Dim AccessThreadID As LongPtr
On Error Resume Next
' Our error string
s = "Sorry...cannot find the MouseHook.dll file" & vbCrLf
s = s & "Please copy the MouseHook.dll file to your Windows System folder or into the same folder as this Access MDB."
' OK Try to load the DLL assuming it is in the Window System folder
hLib = LoadLibrary("MouseHook.dll")
If hLib = 0 Then
' See if the DLL is in the same folder as this MDB
' CurrentDB works with both A97 and A2K or higher
hLib = LoadLibrary(CurrentDBDir() & "MouseHook.dll")
If hLib = 0 Then
MsgBox s, vbOKOnly, "MISSING MOUSEHOOK.dll FILE"
MouseWheelOFF = False
Exit Function
End If
End If
' Get the ID for this thread
AccessThreadID = GetCurrentThreadId()
' Call our MouseHook function in the MouseHook dll.
' Please not the Optional GlobalHook BOOLEAN parameter
' Several developers asked for the MouseHook to be able to work with
' multiple instances of Access. In order to accomodate this request I
' have modified the function to allow the caller to
' specify a thread specific(this current instance of Access only) or
' a global(all applications) MouseWheel Hook.
' Only use the GlobalHook if you will be running multiple instances of Access!
MouseWheelOFF = StopMouseWheel(Application.hWndAccessApp, AccessThreadID, NoSubFormScroll, GlobalHook)
End Function
'******************** Code Begin ****************
'Code courtesy of
'Terry Kreft & Ken Getz
'
Function CurrentDBDir() As String
Dim strDBPath As String
Dim strDBFile As String
strDBPath = CurrentDb.Name
strDBFile = Dir(strDBPath)
CurrentDBDir = Left$(strDBPath, Len(strDBPath) - Len(strDBFile))
End Function
'******************** Code End ****************
I am trying to convert the database to run on both 32 bit and 64 bit Office, as some of my users are using 64 bit Office.
I have done all the usual stuff (Added PtrSafe to "Declare" statements and changed all handles to LongPtr).
I cannot get MouseHook to work on Office 64 bit however. I have it in the same folder as the database, also added it into System32 and SysWOW64 folders just in case!
Whatever I do I always get a message saying "Sorry....cannot find the MouseHook.dll file".
Some forums suggest registering the .dll with regsvr32, but this doesn't work with error message "The module "MouseHook.dll" may not be compatible with the version of Windows that you are running."
The error in Access is coming from the MouseWheel code that I have copied from the example database supplied with the download. In fact, I get the same error if I try and run the example database!
These are the changes I have done to the code to get it to run on 64 bit Access, anyone see any problems? I have tried it with various combinations of "Long" and "LongPtr":
Option Compare Database
Option Explicit
Private Declare PtrSafe Function LoadLibrary Lib "kernel32" _
Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr
Private Declare PtrSafe Function FreeLibrary Lib "kernel32" _
(ByVal hLibModule As LongPtr) As LongPtr
Private Declare PtrSafe Function StopMouseWheel Lib "MouseHook" _
(ByVal hWnd As LongPtr, ByVal AccessThreadID As LongPtr, _
Optional ByVal bNoSubformScroll As Boolean = False, Optional ByVal blIsGlobal As Boolean = False) As Boolean
Private Declare PtrSafe Function StartMouseWheel Lib "MouseHook" _
(ByVal hWnd As LongPtr) As Boolean
Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As LongPtr
' Instance returned from LoadLibrary call
Private hLib As LongPtr
Public Function MouseWheelON() As Boolean
MouseWheelON = StartMouseWheel(Application.hWndAccessApp)
If hLib <> 0 Then
hLib = FreeLibrary(hLib)
End If
End Function
Public Function MouseWheelOFF(Optional NoSubFormScroll As Boolean = False, Optional GlobalHook As Boolean = False) As Boolean
Dim s As String
Dim blRet As Boolean
Dim AccessThreadID As LongPtr
On Error Resume Next
' Our error string
s = "Sorry...cannot find the MouseHook.dll file" & vbCrLf
s = s & "Please copy the MouseHook.dll file to your Windows System folder or into the same folder as this Access MDB."
' OK Try to load the DLL assuming it is in the Window System folder
hLib = LoadLibrary("MouseHook.dll")
If hLib = 0 Then
' See if the DLL is in the same folder as this MDB
' CurrentDB works with both A97 and A2K or higher
hLib = LoadLibrary(CurrentDBDir() & "MouseHook.dll")
If hLib = 0 Then
MsgBox s, vbOKOnly, "MISSING MOUSEHOOK.dll FILE"
MouseWheelOFF = False
Exit Function
End If
End If
' Get the ID for this thread
AccessThreadID = GetCurrentThreadId()
' Call our MouseHook function in the MouseHook dll.
' Please not the Optional GlobalHook BOOLEAN parameter
' Several developers asked for the MouseHook to be able to work with
' multiple instances of Access. In order to accomodate this request I
' have modified the function to allow the caller to
' specify a thread specific(this current instance of Access only) or
' a global(all applications) MouseWheel Hook.
' Only use the GlobalHook if you will be running multiple instances of Access!
MouseWheelOFF = StopMouseWheel(Application.hWndAccessApp, AccessThreadID, NoSubFormScroll, GlobalHook)
End Function
'******************** Code Begin ****************
'Code courtesy of
'Terry Kreft & Ken Getz
'
Function CurrentDBDir() As String
Dim strDBPath As String
Dim strDBFile As String
strDBPath = CurrentDb.Name
strDBFile = Dir(strDBPath)
CurrentDBDir = Left$(strDBPath, Len(strDBPath) - Len(strDBFile))
End Function
'******************** Code End ****************