after a lot of hunting around
I have found a way to track if the list of a DropCombo is showing
(?MyCombo{PROP:ListFEQ}){PROP:WndProc} = ADDRESS( MyWndProc)
In MyWndProc, watch for WM_PosChanging
you’d think WM_PosChanged too, tests show that doesn’t fire when I press ESC to close listbox
When the xMsg = WM_PosChanging
Then the LParam is a pointer to a WindowPos structure
Then look at WindowPos.Flag
BAND(WindowPos.Flag, SWP_ShowWindow)
BAND(WindowPos.Flag, SWP_HideWindow)
The following code just sends info to OutputDebugString (ODS)
But it’s enough to show that you get the necessary info
IntWin32 EQUATE(SIGNED)
gtWindowPos GROUP,TYPE ! https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-windowpos
HWND HWND
HWNDInsertAfter HWND
X IntWin32 ! Left
Y IntWin32 ! Top
CX IntWin32 ! Width in pixels
Cy IntWin32 ! height in pixels
FLAGS UINT ! SWP_* values
END
!SetWindowPos Flags
SWP_NOSIZE EQUATE(00001h) !
SWP_NOMOVE EQUATE(00002h) !
SWP_NOZORDER EQUATE(00004h) !
SWP_NOREDRAW EQUATE(00008h) !
SWP_NOACTIVATE EQUATE(00010h) !
SWP_FRAMECHANGED EQUATE(00020h) ! /* The frame changed: send WM_NCCALCSIZE */
SWP_SHOWWINDOW EQUATE(00040h) !
SWP_HIDEWINDOW EQUATE(00080h) !
SWP_NOCOPYBITS EQUATE(00100h) !
SWP_NOOWNERZORDER EQUATE(00200h) ! /* Don't do owner Z ordering */
SWP_NOSENDCHANGING EQUATE(00400h) ! /* Don't send WM_WINDOWPOSCHANGING */
SWP_DRAWFRAME EQUATE(SWP_FRAMECHANGED )
SWP_NOREPOSITION EQUATE(SWP_NOOWNERZORDER)
!#if(WINVER >= 0x0400)
SWP_DEFERERASE EQUATE(02000h)
SWP_ASYNCWINDOWPOS EQUATE(04000h)
!#endif /* WINVER >= 0x0400 */
WindowPos:ToString PROCEDURE(LONG xlpWindowPos)!,STRING
WindowPosStructure >WindowPos
CODE
WindowPosStructure &= ( xlpWindowPos )
RETURN WindowPos:ToString( WindowPosStructure)
WindowPos:ToString PROCEDURE(*gtWindowPos xWindowPos)!,STRING
CODE
RETURN ' HWND[' & xWindowPos.HWND &']' |
&' HWNDInsertAfter[' & xWindowPos.HWNDInsertAfter &']' |
& ' X[' & xWindowPos.X &']' |
& ' Y[' & xWindowPos.Y &']' |
& ' W[' & xWindowPos.CX &']' |
& ' H[' & xWindowPos.Cy &']' |
& ' FLAGS[' & xWindowPos.FLAGS &']=' & WindowPosFlags:ToString( xWindowPos.Flags )
WindowPosFlags:ToString PROCEDURE(UINT xFlag)
Answer ANY ! string of uknown length
Remaining UINT
CODE
Remaining = xFlag
Answer = ''
IF BAND( xFlag, SWP_NOSIZE ) THEN Answer = Answer & 'NoSize ' ; Remaining -= SWP_NOSIZE END
IF BAND( xFlag, SWP_NOMOVE ) THEN Answer = Answer & 'NoMove ' ; Remaining -= SWP_NOMOVE END
IF BAND( xFlag, SWP_NOZORDER ) THEN Answer = Answer & 'NoZOrder ' ; Remaining -= SWP_NOZORDER END
IF BAND( xFlag, SWP_NOREDRAW ) THEN Answer = Answer & 'NoRedraw ' ; Remaining -= SWP_NOREDRAW END
IF BAND( xFlag, SWP_NOACTIVATE ) THEN Answer = Answer & 'NoActivate ' ; Remaining -= SWP_NOACTIVATE END
IF BAND( xFlag, SWP_FRAMECHANGED ) THEN Answer = Answer & 'FrameChanged ' ; Remaining -= SWP_FRAMECHANGED END
IF BAND( xFlag, SWP_SHOWWINDOW ) THEN Answer = Answer & 'ShowWindow ' ; Remaining -= SWP_SHOWWINDOW END
IF BAND( xFlag, SWP_HIDEWINDOW ) THEN Answer = Answer & 'HideWindow ' ; Remaining -= SWP_HIDEWINDOW END
IF BAND( xFlag, SWP_NOCOPYBITS ) THEN Answer = Answer & 'NoCopybits ' ; Remaining -= SWP_NOCOPYBITS END
IF BAND( xFlag, SWP_NOOWNERZORDER ) THEN Answer = Answer & 'NoOwnerZOrder ' ; Remaining -= SWP_NOOWNERZORDER END
IF BAND( xFlag, SWP_NOSENDCHANGING ) THEN Answer = Answer & 'NoSendChanging ' ; Remaining -= SWP_NOSENDCHANGING END
!IF BAND( xFlag, SWP_DRAWFRAME ) THEN Answer = Answer & 'DrawFrame ' ; Remaining -= SWP_DRAWFRAME END ! same as SWP_FrameChanged
!IF BAND( xFlag, SWP_NOREPOSITION ) THEN Answer = Answer & 'NoReposition ' ; Remaining -= SWP_NOREPOSITION END ! same as SWP_NoOwnerZOrder
IF BAND( xFlag, SWP_DEFERERASE ) THEN Answer = Answer & 'DeferErase' ; Remaining -= SWP_DEFERERASE END
IF BAND( xFlag, SWP_ASYNCWINDOWPOS ) THEN Answer = Answer & 'AsyncWindowpos ' ; Remaining -= SWP_ASYNCWINDOWPOS END
IF Answer = '' THEN Answer = 'Unknown['& xFlag &']' END
IF Remaining THEN Answer = Answer & 'Remaining['& Remaining &']' END
RETURN Answer
SharedWndProc PROCEDURE(STRING xDescr, LONG xOrigWndProc, HWND xhwnd, UINT xMsg, WPARAM xW, LPARAM xL)!,LRESULT,PASCAL
Answer LRESULT,AUTO
W GROUP,OVER(xW)
LoWord SHORT
HiWord SHORT
END
L GROUP,OVER(xL)
LoWord SHORT
HiWord SHORT
END
WindowPosStructure >WindowPos
InterpretMsg ANY
CODE
CASE xMsg
OF WM_WindowPosChanging
OROF WM_WindowPosChanged ; InterpretMsg = WindowPos:ToString( xL )
ELSE InterpretMsg = ''
END
Answer = CallWindowProc( xOrigWndProc, xHWND, xMsg, xW, xL )
DBG.ODS( xDescr & '_WndProc Message['& dbg.GetEventDescr_WM(xMsg) &'] HWND['& xHWND &'] W.Hi['& W.HiWord &'] W.Lo['& W.LoWord &'] L.Hi['& L.HiWord &'] L.Lo['& L.LoWord &'] Answer['& Answer &'] ' & InterpretMsg )
RETURN Answer