CLEAR CLEAR ALL WITH _screen .AddObject("menulistener", "TMenuListener") .menulistener.SetHook ENDWITH DEFINE CLASS TMenuListener As Custom #DEFINE GWL_WNDPROC -4 #DEFINE GWL_EXSTYLE -20 #DEFINE WM_DRAWITEM 0x002B hOrigProc=0 hWindow=0 PROCEDURE Init THIS.declare PROCEDURE Destroy THIS.ReleaseHook PROCEDURE SetHook THIS.ReleaseHook THIS.hWindow = application.hWnd THIS.hOrigProc = GetWindowLong(THIS.hWindow, GWL_WNDPROC) = BINDEVENT(THIS.hWindow, WM_DRAWITEM, THIS, "OnWindowProc") PROCEDURE ReleaseHook = UNBINDEVENTS(THIS.hWindow) THIS.hOrigProc=0 PROCEDURE OnWindowProc(hWindow, nMsgID, wParam, lParam) LOCAL nReturn IF nMsgID=WM_DRAWITEM THIS.OnMenuDraw(m.lParam) ENDIF nReturn = CallWindowProc(THIS.hOrigProc, THIS.hWindow,; m.nMsgID, m.wParam, m.lParam) RETURN m.nReturn PROCEDURE OnMenuDraw(hDrawItemStruct) LOCAL cBuffer, nItemAction, hDC, hPopupWindow cBuffer = REPLICATE(CHR(0),48) = MemToStr(@cBuffer, hDrawItemStruct, LEN(cBuffer)) hDC = buf2dword(SUBSTR(cBuffer,25,4)) hPopupWindow = WindowFromDC(m.hDC) ACTIVATE SCREEN ? hDC, hPopupWindow PROCEDURE declare DECLARE INTEGER WindowFromDC IN user32 INTEGER hDC DECLARE INTEGER GetWindowLong IN user32; INTEGER hWindow, INTEGER nIndex DECLARE INTEGER CallWindowProc IN user32; INTEGER lpPrevWndFunc, INTEGER hWindow, LONG Msg,; INTEGER wParam, INTEGER lParam DECLARE RtlMoveMemory IN kernel32 As MemToStr; STRING @Dest, INTEGER Src, INTEGER nLength ENDDEFINE FUNCTION buf2dword(lcBuffer) RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ; BitLShift(Asc(SUBSTR(lcBuffer, 2,1)), 8) +; BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +; BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24)