ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   API calls, an Event handler, custom menu bar and modal (https://www.excelbanter.com/excel-programming/352809-api-calls-event-handler-custom-menu-bar-modal.html)

DrivenByHim

API calls, an Event handler, custom menu bar and modal
 
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


Robin Hammond[_2_]

API calls, an Event handler, custom menu bar and modal
 
There's a mouse wheel handler on my site he

http://www.enhanceddatasystems.com/E...istScrolls.htm

If you improve on it, please let me know.

Robin Hammond
www.enhanceddatasystems.com

"DrivenByHim" wrote in message
...
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





All times are GMT +1. The time now is 08:49 AM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
ExcelBanter.com