Below is the code for what I call "Message Watch".
It uses a Message loop and one Dialog procedure and it watches to see what messages are passed through to each. You will notice that some messages get passed through the message loop before they go to the dialog procedure, but many do not (they are sent directly to the dialog procedure).
This app allows you to learn about what messages are pased through the message compared to the dialog procedure.
It uses a Message loop and one Dialog procedure and it watches to see what messages are passed through to each. You will notice that some messages get passed through the message loop before they go to the dialog procedure, but many do not (they are sent directly to the dialog procedure).
This app allows you to learn about what messages are pased through the message compared to the dialog procedure.
Code:
' *************************************************************** ' This code can be used Royalty Free and Freely Distributed ! ' Written by Chris Boss 05/11/2009 ' *************************************************************** #COMPILE EXE #REGISTER NONE #DIM ALL ' This is helpful to prevent errors in coding #INCLUDE "win32api.inc" ' Must come first before other include files ! ' ************************************************************* ' Constants and Declares (#1) ' ************************************************************* %FORM1_BUTTON1 = 100 %FORM1_TEXT1 = 110 %FORM1_TEXT2 = 120 ' -------------------------------------------------- DECLARE SUB ShowDialog_Form1(BYVAL hParent&) DECLARE CALLBACK FUNCTION Form1_DLGPROC ' -------------------------------------------------- ' ------------------------------------------------ DECLARE CALLBACK FUNCTION CBF_FORM1_BUTTON1() ' ************************************************************* ' Application Globals Variables (#2) ' ************************************************************* GLOBAL hForm1& ' Dialog handle ' ************************************************************* ' Application Entrance ' ************************************************************* GLOBAL MT() AS STRING GLOBAL M2() AS LONG ' FUNCTION PBMAIN LOCAL Count&, V&, Msg AS tagMsg, T$, X&, C$ DIM M(0 TO %WM_USER) AS LONG REDIM M2(0 TO %WM_USER) AS GLOBAL LONG REDIM MT(0 TO %WM_USER) AS GLOBAL STRING FOR X&=0 TO %WM_USER SELECT CASE X& CASE %WM_NULL:C$="WM_NULL" CASE %WM_CREATE:C$="WM_CREATE" CASE %WM_DESTROY:C$="WM_DESTROY" CASE %WM_MOVE:C$="WM_MOVE" CASE %WM_SIZE:C$="WM_SIZE" CASE %WM_ACTIVATE:C$="WM_ACTIVATE" CASE %WM_SETFOCUS:C$="WM_SETFOCUS" CASE %WM_KILLFOCUS:C$="WM_KILLFOCUS" CASE %WM_ENABLE:C$="WM_ENABLE" CASE %WM_SETTEXT:C$="WM_SETTEXT" CASE %WM_GETTEXT:C$="WM_GETTEXT" CASE %WM_GETTEXTLENGTH:C$="WM_GETTEXTLENGTH" CASE %WM_PAINT:C$="WM_PAINT" CASE %WM_CLOSE:C$="WM_CLOSE" CASE %WM_QUIT:C$="WM_QUIT" CASE %WM_ERASEBKGND:C$="WM_ERASEBKGND" CASE %WM_SHOWWINDOW:C$="WM_SHOWWINDOW" CASE %WM_ACTIVATEAPP:C$="WM_ACTIVATEAPP" CASE %WM_SETCURSOR:C$="WM_SETCURSOR" CASE %WM_GETMINMAXINFO:C$="WM_GETMINMAXINFO" CASE %WM_NEXTDLGCTL:C$="WM_NEXTDLGCTL" CASE %WM_SETFONT:C$="WM_SETFONT" CASE %WM_GETFONT:C$="WM_GETFONT" CASE %WM_WINDOWPOSCHANGING:C$="WM_WINDOWPOSCHANGING" CASE %WM_WINDOWPOSCHANGED:C$="WM_WINDOWPOSCHANGED" CASE %WM_NOTIFY:C$="WM_NOTIFY" CASE %WM_NCCREATE:C$="WM_NCCREATE" CASE %WM_NCDESTROY:C$="WM_NCDESTROY" CASE %WM_NCCALCSIZE:C$="WM_NCCALCSIZE" CASE %WM_NCHITTEST:C$="WM_NCHITTEST" CASE %WM_NCPAINT:C$="WM_NCPAINT" CASE %WM_NCACTIVATE:C$="WM_NCACTIVATE" CASE %WM_GETDLGCODE:C$="WM_GETDLGCODE" CASE %WM_NCMOUSEMOVE:C$="WM_NCMOUSEMOVE" CASE %WM_NCLBUTTONDOWN:C$="WM_NCLBUTTONDOWN" CASE %WM_NCLBUTTONUP:C$="WM_NCLBUTTONUP" CASE %WM_NCLBUTTONDBLCLK:C$="WM_NCLBUTTONDBLCLK" CASE %WM_NCRBUTTONDOWN:C$="WM_NCRBUTTONDOWN" CASE %WM_NCRBUTTONUP:C$="WM_NCRBUTTONUP" CASE %WM_NCRBUTTONDBLCLK:C$="WM_NCRBUTTONDBLCLK" CASE %WM_NCMBUTTONDOWN:C$="WM_NCMBUTTONDOWN" CASE %WM_NCMBUTTONUP:C$="WM_NCMBUTTONUP" CASE %WM_NCMBUTTONDBLCLK:C$="WM_NCMBUTTONDBLCLK" CASE %WM_KEYFIRST:C$="WM_KEYFIRST" CASE %WM_KEYDOWN:C$="WM_KEYDOWN" CASE %WM_KEYUP:C$="WM_KEYUP" CASE %WM_CHAR:C$="WM_CHAR" CASE %WM_DEADCHAR:C$="WM_DEADCHAR" CASE %WM_SYSKEYDOWN:C$="WM_SYSKEYDOWN" CASE %WM_SYSKEYUP:C$="WM_SYSKEYUP" CASE %WM_SYSCHAR:C$="WM_SYSCHAR" CASE %WM_SYSDEADCHAR:C$="WM_SYSDEADCHAR" CASE %WM_KEYLAST:C$="WM_KEYLAST" CASE %WM_INITDIALOG:C$="WM_INITDIALOG" CASE %WM_COMMAND:C$="WM_COMMAND" CASE %WM_SYSCOMMAND:C$="WM_SYSCOMMAND" CASE %WM_TIMER:C$="WM_TIMER" CASE %WM_HSCROLL:C$="WM_HSCROLL" CASE %WM_VSCROLL:C$="WM_VSCROLL" CASE %WM_CTLCOLORMSGBOX:C$="WM_CTLCOLORMSGBOX" CASE %WM_CTLCOLOREDIT:C$="WM_CTLCOLOREDIT" CASE %WM_CTLCOLORLISTBOX:C$="WM_CTLCOLORLISTBOX" CASE %WM_CTLCOLORBTN:C$="WM_CTLCOLORBTN" CASE %WM_CTLCOLORDLG:C$="WM_CTLCOLORDLG" CASE %WM_CTLCOLORSCROLLBAR:C$="WM_CTLCOLORSCROLLBAR" CASE %WM_CTLCOLORSTATIC:C$="WM_CTLCOLORSTATIC" CASE %WM_MOUSEFIRST:C$="WM_MOUSEFIRST" CASE %WM_MOUSEMOVE:C$="WM_MOUSEMOVE" CASE %WM_LBUTTONDOWN:C$="WM_LBUTTONDOWN" CASE %WM_LBUTTONUP:C$="WM_LBUTTONUP" CASE %WM_LBUTTONDBLCLK:C$="WM_LBUTTONDBLCLK" CASE %WM_RBUTTONDOWN:C$="WM_RBUTTONDOWN" CASE %WM_RBUTTONUP:C$="WM_RBUTTONUP" CASE %WM_RBUTTONDBLCLK:C$="WM_RBUTTONDBLCLK" CASE %WM_MBUTTONDOWN:C$="WM_MBUTTONDOWN" CASE %WM_MBUTTONUP:C$="WM_MBUTTONUP" CASE %WM_MBUTTONDBLCLK:C$="WM_MBUTTONDBLCLK" CASE %WM_MOUSEWHEEL:C$="WM_MOUSEWHEEL" CASE %WM_MOUSELAST:C$="WM_MOUSELAST" CASE %WM_SIZING:C$="WM_SIZING" CASE %WM_CAPTURECHANGED:C$="WM_CAPTURECHANGED" CASE %WM_MOVING:C$="WM_MOVING" CASE %WM_MOUSEHOVER:C$="WM_MOUSEHOVER" CASE %WM_MOUSELEAVE:C$="WM_MOUSELEAVE" CASE ELSE C$=" &H"+HEX$(X&) END SELECT MT(X&)=C$ NEXT X& ShowDialog_Form1 0 DO ' must call PostQuitMessage in last forms WM_DESTROY message V&=GetMessage(Msg,%NULL,0,0) IF V&=0 THEN EXIT DO IF V&=-1 THEN EXIT DO IF Msg.message=%WM_QUIT THEN EXIT DO IF Msg.message>=0 AND Msg.message<=%WM_USER THEN IF M(Msg.message)=0 THEN ' add to visible list T$="" M(Msg.message)=1 FOR X&=0 TO %WM_USER IF M(X&)<>0 THEN T$=T$+MT(X&)+ CHR$(13)+CHR$(10) END IF NEXT X& CONTROL SET TEXT hForm1&, %FORM1_TEXT1, T$ END IF END IF TranslateMessage Msg DispatchMessage Msg LOOP END FUNCTION ' ************************************************************* ' Application Dialogs (#3) ' ************************************************************* SUB ShowDialog_Form1(BYVAL hParent&) LOCAL Style&, ExStyle&, hFont& LOCAL N&, CT& ' Variables used for Reading Data in Arrays for Listbox and Combobox ' hParent& = 0 if no parent Dialog Style& = %WS_POPUP OR %DS_MODALFRAME OR %WS_CAPTION OR %WS_MINIMIZEBOX OR %WS_SYSMENU OR %DS_CENTER OR %WS_THICKFRAME ExStyle& = 0 FONT NEW "Courier New", 10 TO hFont& DIALOG NEW hParent&, "Your Dialog", 0, 0, 420, 300, Style&, ExStyle& TO hForm1& CONTROL ADD "Button", hForm1&, %FORM1_BUTTON1, "Send %WM_USER", 24, 25, 77, 59, _ %WS_CHILD OR %WS_VISIBLE OR %BS_PUSHBUTTON OR %WS_TABSTOP CALL CBF_FORM1_BUTTON1 CONTROL ADD LABEL, hForm1&, -1, "Message Loop Messages", 110,15,140,10 CONTROL ADD LABEL, hForm1&, -2, "Dialog Procedure Messages", 260,15,140,10 CONTROL ADD TEXTBOX ,hForm1&, %FORM1_TEXT1, "", 110,25,140, 250, %WS_CHILD OR %WS_VISIBLE OR %WS_BORDER OR %ES_MULTILINE OR %ES_READONLY OR %WS_VSCROLL CONTROL SET COLOR hForm1&, %FORM1_TEXT1, RGB(0,0,0), RGB(255,255,255) CONTROL SET FONT hForm1&, %FORM1_TEXT1, hFont& CONTROL ADD TEXTBOX ,hForm1&, %FORM1_TEXT2, "", 260,25,140, 250, %WS_CHILD OR %WS_VISIBLE OR %WS_BORDER OR %ES_MULTILINE OR %ES_READONLY OR %WS_VSCROLL CONTROL SET COLOR hForm1&, %FORM1_TEXT2, RGB(0,0,0), RGB(255,255,255) CONTROL SET FONT hForm1&, %FORM1_TEXT2, hFont& DIALOG SHOW MODELESS hForm1& , CALL Form1_DLGPROC END SUB ' ************************************************************* ' Dialog Callback Procedure ' for Form Form1 ' uses Global Handle - hForm1& ' ************************************************************* %WM_UpdateList = %WM_USER+400 ' CALLBACK FUNCTION Form1_DLGPROC LOCAL T$, X& IF CBMSG>=0 AND CBMSG<=%WM_USER THEN IF M2(CBMSG)=0 THEN ' add to visible list M2(CBMSG)=1 PostMessage CBHNDL, %WM_UpdateList,0,0 END IF END IF SELECT CASE CBMSG CASE %WM_UpdateList T$="" FOR X&=0 TO %WM_USER IF M2(X&)<>0 THEN T$=T$+MT(X&)+ CHR$(13)+CHR$(10) END IF NEXT X& CONTROL SET TEXT hForm1&, %FORM1_TEXT2, T$ FUNCTION=1 EXIT FUNCTION CASE %WM_USER ' this will be sent message from button FUNCTION=1 EXIT FUNCTION CASE %WM_DESTROY PostQuitMessage 0 CASE ELSE END SELECT END FUNCTION ' ************************************************************* ' Application Callback Functions (or Subs) for Controls (#4) ' ************************************************************* CALLBACK FUNCTION CBF_FORM1_BUTTON1 IF CBCTLMSG=%BN_CLICKED THEN DIALOG SEND hForm1&,%WM_USER,0,0 END IF END FUNCTION