Thanks for the help. Need a little bit more on how to structure the code for 100s of windowprocs.
Can I put the windowproc in an object?
{
private LP originalWindowProc
WindowProc( hwnd, uMsg, wParam, lParam) {
if (wParam == WM_MOUSEWHEEL) {
return 0;
(originalWindowProc)(hwnd, uMsg, wParam, lParam)
how do I call a pointer in clarion?
}
No you cannot put a WindowProc directly in an object as the first parameter would change to the object instance (self)
That said, you can write a local procedure and use that from an object.
Note, your code looks like C, you’ll need to write it in CW (clarion for windows)
The somewhat un-obvious trick will be to be able to retrieve the origWndProc from within the WndProc itself. I used these a decade ago, I assume they’re still good
The template just generates one call of a method for each list control in each window procedure in an app. In hand coded project one can do the same manually (hand code project is included in the package).
If nCode is less than zero, the hook procedure must return the value returned by CallNextHookEx.
If nCode is greater than or equal to zero, and the hook procedure did not process the message, it is highly recommended that you call CallNextHookEx and return the value it returns; otherwise, other applications that have installed WH_MOUSE_LL hooks will not receive hook notifications and may behave incorrectly as a result. If the hook procedure processed the message, it may return a nonzero value to prevent the system from passing the message to the rest of the hook chain or the target window procedure.
myMouseHook procedure(long ncode, long wparam, long lparam)
hMouse long (0)
code
! per https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-callnexthookex
! hMouse is ignored
if (ncode >= 0) and (wparam = WM_MOUSEWHEEL)
return 1
else
return api_CallNextHookEx(hMouse, ncode, wParam, lparam)
end
Here I’m talking about WndProc only. Regarding mouse hooks, I used them in my Script Player product, below is mouse hook code, but there I don’t process wheel messages:
wh::MouseProc PROCEDURE(LONG pCode, UNSIGNED wParam, LONG lParam)
mouseInfo &MOUSEHOOKSTRUCT, AUTO !-- in lParam
mouseData LIKE(TMouseHookData), AUTO
pt LIKE(POINT), AUTO
vLPressed BOOL, AUTO !-- left mouse button pressed
vRPressed BOOL, AUTO !-- right mouse button pressed
ctrl &TMouseHooker
CODE
IF pCode < 0
RETURN wh::CallNextHookEx(ctrlMgr.hHook, pCode, wParam, lParam)
END
mouseInfo &= (lParam)
!-- find an instance
ctrl &= ctrlMgr.GetControl(mouseInfo.hwnd)
IF ctrl &= NULL
!-- this control is not in the list
RETURN wh::CallNextHookEx(ctrlMgr.hHook, pCode, wParam, lParam)
END
!-- action
mouseData.Action = wParam
!-- screen pos
pt = mouseInfo.pt
mouseData.ScreenPt = pt
!-- client pos
wh::ScreenToClient(mouseInfo.hwnd, pt)
mouseData.ClientPt = pt
mouseData.LPressed = CHOOSE(BAND(wh::GetAsyncKeyState(VK_LBUTTON), 08000h) > 0)
mouseData.RPressed = CHOOSE(BAND(wh::GetAsyncKeyState(VK_RBUTTON), 08000h) > 0)
IF ctrl.MouseProc(mouseData)
RETURN wh::CallNextHookEx(ctrlMgr.hHook, pCode, wParam, lParam)
END
RETURN 0
I add the wndproc to filter all mouse wheel messages for each drop down list as they are created. The mouse scroll wheel has no effect when the mouse is over the drop down list. This is the desired behavior.
But, when the drop down list is selected, moving the mouse scroll wheel almost anywhere other than the over the drop down list caused the option to change w/o dropping down the list.
I’m starting to sprinkle the wndproc to sheet and tab controls and the window.
Yup, when mouse corsor is not over a dropdown box, WM_MOUSEWHEEL message never fires, but the value is changing. Maybe Spy++ will help to find a solution.
Possibly try a call to Debuger.GetEventDescr_WM inside of your WndProc, that’s sorta like Spy++ but uses SV’s namings for events, which includes some of the user defined ones.
Sorry to raise this thread, but if someone in the future needs info on how to get other events.
It is possible using PROP:WndProc and PROP:ClientWndProc. To find more about it you need to search as WndProc or ClientWndProc in help index.
For window events you can use both, depends on where you need it. For lists, on the other hand, it is necessary to use only WndProc. Since list behaves as “attached window” to window.