In a perfect world, Excel VBA forms would include mouse scroll wheel
functionality. Unfortunately, Excel VBA does not process the WM_MOUSEWHEEL.
I had to write my own event handler using calls to user32.dll.
The problem is, I can't seem to combine "hooking" my event handler (by
making calls to SetWindowLong with the GWL_WNDPROC index) AND making calls to
customize the window (by making calls to SetWindowLong with the GWL_STYLE
index as well as some other basic calls to SetWindowPos).
On top of that, if the excel form is set to "modal" = false, my event
handler seems to be spammed with messages that it won't send off to it's
previous windows handler (Excel). Thus, I cannot keep the excel application
minimized and have my form appear as though it is a separate application.
The event handler is as follows in modified code: (Please assume that all
variables and constants are declared correctly, and that the code is working)
Private Function Fnc_EventHandler(ByVal Lwnd As Long, _
ByVal Lmsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Dim MouseKeys As Long
Dim Rotation As Long
Select Case Lmsg
'Handle mouse wheel messages
Case WM_MOUSEWHEEL
MouseKeys = wParam And 65535
Rotation = wParam / 65536
'MouseWheel function
Call MouseWheelHandler(Rotation)
'Pass everything else back to excel for processing
Case Else
Fnc_EventHandler = CallWindowProc(g_LocalPrevWndProc, Lwnd,
Lmsg, wParam, lParam)
End Select
End Function
Here is my hook in modified code:
Public Sub Sub_Hook(ByRef FormMain As UserForm, _
ByRef c_Main_ParamRef As My_Main_Class)
Dim WindowStyle As Long
Set g_Form_Main = FormMain
Set c_Main_ParamRef = My_Main_Class
g_LocalHwnd = FindWindow("ThunderdFrame", g_Form_Main.Caption)
g_LocalPrevWndProc = SetWindowLong(g_LocalHwnd, GWL_WNDPROC, AddressOf
Fnc_EventHandler)
'More calls to user32.dll, only my event handler OR the following code
works, not both! The following code adds my form to the taskbar as well as
adds a minimmize button
g_ReturnResult = GetWindowLong(g_LocalHwnd, GWL_STYLE)
If (g_ReturnResult And &H20000) = 0 Then
Call SetWindowLong(g_LocalHwnd, GWL_STYLE, g_ReturnResult Or
WS_MINIMIZEBOX)
End If
WindowStyle = GetWindowLong(g_LocalHwnd, GWL_EXSTYLE)
WindowStyle = WindowStyle Or WS_EX_APPWINDOW
g_ReturnResult = SetWindowPos(g_LocalHwnd, HWND_TOP, _
0, 0, _
0, 0, _
SWP_NOMOVE Or SWP_NOSIZE Or
SWP_NOACTIVATE Or SWP_HIDEWINDOW)
g_ReturnResult = SetWindowLong(g_LocalHwnd, GWL_EXSTYLE, lint_WindowStyle)
g_ReturnResult = SetWindowPos(g_LocalHwnd, HWND_TOP, _
0, 0, _
0, 0, _
SWP_NOMOVE Or SWP_NOSIZE Or
SWP_NOACTIVATE Or SWP_SHOWWINDOW)
End Sub
There's a mouse wheel handler on my site here:
http://www.enhanceddatasystems.com/E...istScrolls.htm
If you improve on it, please let me know.
Robin Hammond
www.enhanceddatasystems.com
"DrivenByHim" <DrivenByHim@discussions.microsoft.com> wrote in message
news:53E0BD86-5389-42E6-8516-0F914244A406@microsoft.com...
> In a perfect world, Excel VBA forms would include mouse scroll wheel
> functionality. Unfortunately, Excel VBA does not process the
> WM_MOUSEWHEEL.
> I had to write my own event handler using calls to user32.dll.
>
> The problem is, I can't seem to combine "hooking" my event handler (by
> making calls to SetWindowLong with the GWL_WNDPROC index) AND making calls
> to
> customize the window (by making calls to SetWindowLong with the GWL_STYLE
> index as well as some other basic calls to SetWindowPos).
>
> On top of that, if the excel form is set to "modal" = false, my event
> handler seems to be spammed with messages that it won't send off to it's
> previous windows handler (Excel). Thus, I cannot keep the excel
> application
> minimized and have my form appear as though it is a separate application.
>
> The event handler is as follows in modified code: (Please assume that all
> variables and constants are declared correctly, and that the code is
> working)
>
> Private Function Fnc_EventHandler(ByVal Lwnd As Long, _
> ByVal Lmsg As Long, _
> ByVal wParam As Long, _
> ByVal lParam As Long) As Long
>
> Dim MouseKeys As Long
> Dim Rotation As Long
>
> Select Case Lmsg
>
> 'Handle mouse wheel messages
> Case WM_MOUSEWHEEL
>
> MouseKeys = wParam And 65535
> Rotation = wParam / 65536
>
> 'MouseWheel function
> Call MouseWheelHandler(Rotation)
>
> 'Pass everything else back to excel for processing
> Case Else
>
> Fnc_EventHandler = CallWindowProc(g_LocalPrevWndProc, Lwnd,
> Lmsg, wParam, lParam)
>
> End Select
>
> End Function
>
> Here is my hook in modified code:
>
> Public Sub Sub_Hook(ByRef FormMain As UserForm, _
> ByRef c_Main_ParamRef As My_Main_Class)
>
> Dim WindowStyle As Long
>
> Set g_Form_Main = FormMain
> Set c_Main_ParamRef = My_Main_Class
>
> g_LocalHwnd = FindWindow("ThunderdFrame", g_Form_Main.Caption)
>
> g_LocalPrevWndProc = SetWindowLong(g_LocalHwnd, GWL_WNDPROC, AddressOf
> Fnc_EventHandler)
>
> 'More calls to user32.dll, only my event handler OR the following code
> works, not both! The following code adds my form to the taskbar as well
> as
> adds a minimmize button
>
> g_ReturnResult = GetWindowLong(g_LocalHwnd, GWL_STYLE)
>
> If (g_ReturnResult And &H20000) = 0 Then
>
> Call SetWindowLong(g_LocalHwnd, GWL_STYLE, g_ReturnResult Or
> WS_MINIMIZEBOX)
>
> End If
>
> WindowStyle = GetWindowLong(g_LocalHwnd, GWL_EXSTYLE)
>
> WindowStyle = WindowStyle Or WS_EX_APPWINDOW
>
> g_ReturnResult = SetWindowPos(g_LocalHwnd, HWND_TOP, _
> 0, 0, _
> 0, 0, _
> SWP_NOMOVE Or SWP_NOSIZE Or
> SWP_NOACTIVATE Or SWP_HIDEWINDOW)
>
> g_ReturnResult = SetWindowLong(g_LocalHwnd, GWL_EXSTYLE,
> lint_WindowStyle)
>
> g_ReturnResult = SetWindowPos(g_LocalHwnd, HWND_TOP, _
> 0, 0, _
> 0, 0, _
> SWP_NOMOVE Or SWP_NOSIZE Or
> SWP_NOACTIVATE Or SWP_SHOWWINDOW)
>
> End Sub
>
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks