** 12/29/2004 ** THIS IS THE PRIMARY EVENT HANDLER ROUTINE ** DO NOT RUN IF THE EVENT HANDLER IS ALREADY INSTANTIATED (THIS REALLY SHOULDN'T HAPPEN) IF TYPE("oEventHandler") = "O" RETURN ENDIF ** INCLUDE WINEVENTS.H #INCLUDE WinEvents.H ** CREATE THE PRIMARY EVENT HANDLER CLASS PUBLIC oEventHandler oEventHandler = CREATEOBJECT("EventHandler") ** BIND THE EVENTS THAT WE NEED TO BINDEVENT(_VFP.hWnd, WM_KEYUP, oEventHandler, "Eventhandler") BINDEVENT(_VFP.hWnd, WM_ACTIVATE, oEventHandler, "Eventhandler") ** END
DEFINE CLASS EventHandler AS Custom nOldProc = 0 FUNCTION Init DECLARE INTEGER GetWindowLong IN Win32API ; INTEGER HWND, INTEGER nIndex DECLARE INTEGER CallWindowProc IN Win32API ; INTEGER lpPrevWndFunc, INTEGER HWND, INTEGER Msg, INTEGER wParam, ; INTEGER LPARAM DECLARE INTEGER FindWindowEx IN Win32API; INTEGER, INTEGER, STRING, STRING DECLARE INTEGER GetWindowText IN Win32API ; INTEGER, STRING @, INTEGER THIS.nOldProc = GetWindowLong(_SCREEN.HWND, GWL_WNDPROC) ENDFUNC FUNCTION EventHandler(hWnd, Msg, wParam, lParam) DO CASE ** WINDOW ACTIVATE CASE Msg = WM_ACTIVATE ** THE STATUS BAR DOES NOT UPDATE WHEN VFP DOES NOT HAVE FOCUS ** THIS CAUSES THE STATUS BAR TO REFRESH UPON WINDOW ACTIVATION IF TYPE("_Screen.Status_Bar") = "O" _Screen.Status_Bar.Refresh_Data ENDIF ** KEYPRESS RELEASE CASE Msg = WM_KEYUP DO CASE ** CAPSLOCK & NUMLOCK CASE wParam = 20 OR wParam = 144 IF TYPE("_Screen.Status_Bar") = "O" _Screen.Status_Bar.Refresh_Data ENDIF ENDCASE ENDCASE ** PRIMARY RETURN -- THIS NEEDS TO BE HERE OR THE WINDOWS EVENT WILL BE TRAPPED ** THIS IS THE EQUIVALENT OF DODEFAULT IN FOXPRO RETURN CallWindowProc(This.nOldProc, hWnd, Msg, wParam, lParam) ENDFUNC ENDDEFINE