═══ 1. PMSPY - Version 1.1 ═══ PMSPY allows you to spy: 1. messages that are posted to windows through a message queue 2. messages that are sent directly to windows This includes PM as well as any internal application messages that may be used. The window may be visible or invisible (OBJECT). It is an excellent learning tool for PM programming because it visibly demonstrates PM's message based operation. It also excels as a PM application debugging tool because: o No application coding is necessary for passive debugging o Active debugging is possible if the application is coded with PMSPY debugging in mind. For example, current values of flags, counters, etc can be "stuffed" into unused MP1 and/or MP2 fields and then examined with PMSPY. This can provide an x-ray view into the internals of an application as it executes. o It may be started before or while the application is running o Up to 8 different agents may be active at once allowing for the debugging of complex inter-window, intra-window, multi-threaded, or OBJECT window applications Basic operations and features include: 1. Simple point and shoot selection of desktop windows 2. Simple selection of invisible and/or OBJECT windows from a list 3. A filtering mechanism allows you to include or exclude individual or groups of messages. 4. Messages can be defined to trigger the message spying actions. 5. The filtering mechanism is totally user definable via a profile. 6. A default profile is automatically provided for out-of-the-box operation. 7. Messages may optionally be logged to a log file. Other thing you may be interested in: 1. How do I do it? 2. The message list 3. Command line parameters 4. known limitations ═══ 2. How do I do it? ═══ Here's some actions you may want to know how-to-do. Double-click on a highlighted phrase to move to its detailed explanation. o To debug a dialog procedure o To see all WM_USER messages o To see all unknown messages o Use trigger messages o To add a text note to the spy list and (maybe) log file o To save agent characteristics (like the font you selected for the spy list, window position and size) for the next time you run PMSPY ═══ 3. How to Install and Use PMSPY ═══ 1. The following files are required to run PMSPY: File Name Description PMSPY.EXE Executable code PMSPY.HLP Online help PMSPY.DLL PM resources (strings, messages, dialogs, etc) PMSPYHK.DLL Dynamic link library containing "hook" code 2. Copy PMSPY.DLL and PMSPYHK.DLL into a subdirectory which is accessible using the LIBPATH statement in the CONFIG.SYS file (e.g. C:\OS2\DLL) or add the path to the LIBPATH statement and reboot (only after having made all CONFIG.SYS changes). 3. Copy PMSPY.EXE into a subdirectory which is in your PATH statement in the CONFIG.SYS file (e.g. C:\OS2) or add the path to the PATH statement. 4. Copy PMSPY.HLP into a subdirectory which is in your HELP statement in the CONFIG.SYS file (e.g. C:\OS2\HELP) or add the path to the HELP statement. 5. Create a PMSPY program object in one of your OS/2 folders. Be sure to specify that PMSPY.EXE to be executed from the drive and path where you placed the code above. Specify any desired command line parameters. 6. When you're ready to begin spying, just double-click on the PMSPY program object. You may start up to 8 different instances of PMSPY to help you analyze/debug complex PM applications. ═══ 4. How Does PMSPY Work? ═══ After you select a target window PMSPY installs an INPUT and SENDMSG hook into the window's message queue. This allows the spying of all the messages destined for the window. Note: The PM system queue may also be selected... If you have requested to spy on the queue, you will see all messages going through this queue, which means you get the messages from all the windows associated with this queue. This is particularly important when you want to debug dialogs. ═══ 5. Known Limitations ═══ The following limitations are known: 1. There is no current method for defining the MP formatting styles on a per message basis in a profile. Note: This will be provided in the next release... 2. There is NO profile error reporting (for example, you may be able to generate multiple occurrences of the same group and/or message) 3. If PMSPYHK.DLL is not found along LIBPATH, PMSPY will not start. The message 'SYS1804 file not found' is issued with the explanation that this is an invalid command. ═══ 6. How do I debug dialog procs? ═══ To debug dialog procedures: 1. Use Select desktop window and select the parent/frame window for spying. This is because the dialog you want to debug will share the same message queue once its created. 2. Use Spy on queue to be sure that you are spying on all messages that all moving through the message queue. This will include the frame and all subsequent dialogs. 3. Start the dialog. You should be able to see WM_CREATE messages for each dialog control as well as the WM_INITDLG message that comes to your dialog procedure. ═══ 7. Saving agent characteristics ═══ To save this agent's characteristics for subsequent PMSPY use, use the Save options pull-down under Options. The following data is saved on a per agent basis in PMSPY.INI. This file is always placed in the current directory. o the current size and position of the PMSPY window o the name of the last font you selected for the spy list o the name of the last profile you opened o the name of the last log file you opened Each time PMSPY starts, it tries to use any data previously saved for the agent currently being started (1, 2, and so on) If this data is not available, default values are automatically used. ═══ 8. Message List ═══ PMSPY places the following items into the message list: 1. Eligible messages (as defined by the current profile and operational settings). Each list item represents a single PM message: WM_BUTTON1UP 005C002A 00000000 P 03300CC8      Mnemonic MP1 MP2 │ target message │ HWND name S=sent ─┤ P=posted─┘ Note: To view the message parameters in different formats, double-click mouse button #1 on the list item 2. Programmer entered text notes 3. PMSPY status messages. The horizontal scroll bar can be used to scroll the message data left or right to position just the data you care about in view. Here is a sample message list. It contains notes, status messages, and PM messages. PM Spy - Window 03300CC8 WM_BUTTON2DOWN 00580085 00000000 P 03300CC8 WM_BUTTON2UP 0039008C 00000000 P 03300CC8 WM_PAINT 00000000 00000000 S 03300CC8 WM_SETFOCUS 0C902FB0 00000000 S 03300CC8 WM_SETSELECTION 00000000 00000000 S 03300CC8 WM_ACTIVATE 00000000 02900BA8 S 03300CC8 This is a NOTE: ready to look at UNDEFINED messages WM_BUTTON2DOWN 004C0093 00000000 P 03300CC8 WM_FOCUSCHANGE 0C902FB0 00000001 S 03300CC8 WM_ACTIVATE 00000001 02900BA8 S 03300CC8 WM_SETFOCUS 0C902FB0 00000001 S 03300CC8 WM_???? (0303) 02470306 00010001 S 03300CC8 WM_???? (0303) 02370306 00010001 S 03300CC8 WM_???? (0303) 02300304 00010001 S 03300CC8 WM_???? (0303) 022D0303 00010001 S 03300CC8 WM_BUTTON2UP 0017002B 00000000 P 03300CC8 all done, closing the LOG file ═══ 9. Default Profile ═══ The default PROFILE defines how PMSPY operates "out of the box". /* PMSPY Default Profile - Created Jul 23 1993 */ /* Built using the OS/2 2.0 Toolkit */ /* Color Definitions */ Color 1 SYSCLR_WINDOWTEXT Color 2 SYSCLR_ACTIVETITLE Color 3 SYSCLR_WINDOWSTATICTEXT Color 4 CLR_RED Color 5 CLR_PINK Color 6 CLR_DARKGREEN Color 7 CLR_DARKCYAN Color 8 CLR_BLUE Group MouseMovement 1 Define WM_HITTEST 0x000C Define WM_CONTROLPOINTER 0x0038 Define WM_MOUSEMOVE 0x0070 Group StandardWindow 1 Define WM_NULL 0x0000 Define WM_CREATE 0x0001 Define WM_DESTROY 0x0002 Define WM_ENABLE 0x0004 Define WM_SHOW 0x0005 Define WM_MOVE 0x0006 Define WM_SIZE 0x0007 Define WM_ADJUSTWINDOWPOS 0x0008 Define WM_CALCVALIDRECTS 0x0009 Define WM_SETWINDOWPARAMS 0x000A Define WM_QUERYWINDOWPARAMS 0x000B Define WM_ACTIVATE 0x000D Define WM_SETFOCUS 0x000F Define WM_SETSELECTION 0x0010 Define WM_COMMAND 0x0020 Define WM_SYSCOMMAND 0x0021 Define WM_HELP 0x0022 Define WM_PAINT 0x0023 Define WM_TIMER 0x0024 Define WM_SEM1 0x0025 Define WM_SEM2 0x0026 Define WM_SEM3 0x0027 Define WM_SEM4 0x0028 Define WM_CLOSE 0x0029 Define WM_QUIT 0x002A Define WM_SYSCOLORCHANGE 0x002B Define WM_SYSVALUECHANGED 0x002D Define WM_APPTERMINATENOTIFY 0x002E Define WM_PRESPARAMCHANGED 0x002F Define WM_QUERYCONVERTPOS 0x00B0 Group LanguageSupport 1 Define WM_PPAINT 0x0011 Define WM_PSETFOCUS 0x0012 Define WM_PSYSCOLORCHANGE 0x0013 Define WM_PSIZE 0x0014 Define WM_PACTIVATE 0x0015 Define WM_PCONTROL 0x0016 Group Control 1 Define WM_CONTROL 0x0030 Define WM_VSCROLL 0x0031 Define WM_HSCROLL 0x0032 Define WM_INITMENU 0x0033 Define WM_MENUSELECT 0x0034 Define WM_MENUEND 0x0035 Define WM_DRAWITEM 0x0036 Define WM_MEASUREITEM 0x0037 Define WM_QUERYDLGCODE 0x003A Define WM_INITDLG 0x003B Define WM_SUBSTITUTESTRING 0x003C Define WM_MATCHMNEMONIC 0x003D Define WM_SAVEAPPLICATION 0x003E Group Frame 1 Define WM_FLASHWINDOW 0x0040 Define WM_FORMATFRAME 0x0041 Define WM_UPDATEFRAME 0x0042 Define WM_FOCUSCHANGE 0x0043 Define WM_SETBORDERSIZE 0x0044 Define WM_TRACKFRAME 0x0045 Define WM_MINMAXFRAME 0x0046 Define WM_SETICON 0x0047 Define WM_QUERYICON 0x0048 Define WM_SETACCELTABLE 0x0049 Define WM_QUERYACCELTABLE 0x004A Define WM_TRANSLATEACCEL 0x004B Define WM_QUERYTRACKINFO 0x004C Define WM_QUERYBORDERSIZE 0x004D Define WM_NEXTMENU 0x004E Define WM_ERASEBACKGROUND 0x004F Define WM_QUERYFRAMEINFO 0x0050 Define WM_QUERYFOCUSCHAIN 0x0051 Define WM_OWNERPOSCHANGE 0x0052 Define WM_CALCFRAMERECT 0x0053 Define WM_WINDOWPOSCHANGED 0x0055 Define WM_QUERYFRAMECTLCOUNT 0x0059 Define WM_QUERYHELPINFO 0x005B Define WM_SETHELPINFO 0x005C Define WM_ERROR 0x005D Define WM_REALIZEPALETTE 0x005E Group Clipboard 1 Define WM_RENDERFMT 0x0060 Define WM_RENDERALLFMTS 0x0061 Define WM_DESTROYCLIPBOARD 0x0062 Define WM_PAINTCLIPBOARD 0x0063 Define WM_SIZECLIPBOARD 0x0064 Define WM_HSCROLLCLIPBOARD 0x0065 Define WM_VSCROLLCLIPBOARD 0x0066 Define WM_DRAWCLIPBOARD 0x0067 Group MouseButtons 1 Define WM_BUTTON1DOWN 0x0071 Define WM_BUTTON1UP 0x0072 Define WM_BUTTON1DBLCLK 0x0073 Define WM_BUTTON2DOWN 0x0074 Define WM_BUTTON2UP 0x0075 Define WM_BUTTON2DBLCLK 0x0076 Define WM_BUTTON3DOWN 0x0077 Define WM_BUTTON3UP 0x0078 Define WM_BUTTON3DBLCLK 0x0079 Group CharacterIO 1 Define WM_CHAR 0x007A Define WM_VIOCHAR 0x007B Group Journal 1 Define WM_JOURNALNOTIFY 0x007C Group DynamicDataExchange 1 Define WM_DDE_INITIATE 0x00A0 Define WM_DDE_REQUEST 0x00A1 Define WM_DDE_ACK 0x00A2 Define WM_DDE_DATA 0x00A3 Define WM_DDE_ADVISE 0x00A4 Define WM_DDE_UNADVISE 0x00A5 Define WM_DDE_POKE 0x00A6 Define WM_DDE_EXECUTE 0x00A7 Define WM_DDE_TERMINATE 0x00A8 Define WM_DDE_INITIATEACK 0x00A9 Group Static Control 1 Define SM_SETHANDLE 0x0100 Define SM_QUERYHANDLE 0x0101 Group Button 1 Define BM_CLICK 0x0120 Define BM_QUERYCHECKINDEX 0x0121 Define BM_QUERYHILITE 0x0122 Define BM_SETHILITE 0x0123 Define BM_QUERYCHECK 0x0124 Define BM_SETCHECK 0x0125 Define BM_SETDEFAULT 0x0126 Group EntryField 1 Define EM_QUERYCHANGED 0x0140 Define EM_QUERYSEL 0x0141 Define EM_SETSEL 0x0142 Define EM_SETTEXTLIMIT 0x0143 Define EM_CUT 0x0144 Define EM_COPY 0x0145 Define EM_CLEAR 0x0146 Define EM_PASTE 0x0147 Define EM_QUERYFIRSTCHAR 0x0148 Define EM_SETFIRSTCHAR 0x0149 Define EM_QUERYREADONLY 0x014A Define EM_SETREADONLY 0x014B Define EM_SETINSERTMODE 0x014C Group ListBox 1 Define LM_QUERYITEMCOUNT 0x0160 Define LM_INSERTITEM 0x0161 Define LM_SETTOPINDEX 0x0162 Define LM_DELETEITEM 0x0163 Define LM_SELECTITEM 0x0164 Define LM_QUERYSELECTION 0x0165 Define LM_SETITEMTEXT 0x0166 Define LM_QUERYITEMTEXTLENGTH 0x0167 Define LM_QUERYITEMTEXT 0x0168 Define LM_SETITEMHANDLE 0x0169 Define LM_QUERYITEMHANDLE 0x016A Define LM_SEARCHSTRING 0x016B Define LM_SETITEMHEIGHT 0x016C Define LM_QUERYTOPINDEX 0x016D Define LM_DELETEALL 0x016E Group ComboBox 1 Define CBM_SHOWLIST 0x0170 Define CBM_HILITE 0x0171 Define CBM_ISLISTSHOWING 0x0172 Group Menu 1 Define MM_INSERTITEM 0x0180 Define MM_DELETEITEM 0x0181 Define MM_QUERYITEM 0x0182 Define MM_SETITEM 0x0183 Define MM_QUERYITEMCOUNT 0x0184 Define MM_STARTMENUMODE 0x0185 Define MM_ENDMENUMODE 0x0186 Define MM_REMOVEITEM 0x0188 Define MM_SELECTITEM 0x0189 Define MM_QUERYSELITEMID 0x018A Define MM_QUERYITEMTEXT 0x018B Define MM_QUERYITEMTEXTLENGTH 0x018C Define MM_SETITEMHANDLE 0x018D Define MM_SETITEMTEXT 0x018E Define MM_ITEMPOSITIONFROMID 0x018F Define MM_ITEMIDFROMPOSITION 0x0190 Define MM_QUERYITEMATTR 0x0191 Define MM_SETITEMATTR 0x0192 Define MM_ISITEMVALID 0x0193 Define MM_QUERYITEMRECT 0x0194 Group ScrollBar 1 Define SBM_SETSCROLLBAR 0x01A0 Define SBM_SETPOS 0x01A1 Define SBM_QUERYPOS 0x01A2 Define SBM_QUERYRANGE 0x01A3 Define SBM_SETTHUMBSIZE 0x01A6 Group MultiLineEdit 1 Define MLM_SETTEXTLIMIT 0x01B0 Define MLM_QUERYTEXTLIMIT 0x01B1 Define MLM_SETFORMATRECT 0x01B2 Define MLM_QUERYFORMATRECT 0x01B3 Define MLM_SETWRAP 0x01B4 Define MLM_QUERYWRAP 0x01B5 Define MLM_SETTABSTOP 0x01B6 Define MLM_QUERYTABSTOP 0x01B7 Define MLM_SETREADONLY 0x01B8 Define MLM_QUERYREADONLY 0x01B9 Define MLM_QUERYCHANGED 0x01BA Define MLM_SETCHANGED 0x01BB Define MLM_QUERYLINECOUNT 0x01BC Define MLM_CHARFROMLINE 0x01BD Define MLM_LINEFROMCHAR 0x01BE Define MLM_QUERYLINELENGTH 0x01BF Define MLM_QUERYTEXTLENGTH 0x01C0 Define MLM_FORMAT 0x01C1 Define MLM_SETIMPORTEXPORT 0x01C2 Define MLM_IMPORT 0x01C3 Define MLM_EXPORT 0x01C4 Define MLM_DELETE 0x01C6 Define MLM_QUERYFORMATLINELENGTH 0x01C7 Define MLM_QUERYFORMATTEXTLENGTH 0x01C8 Define MLM_INSERT 0x01C9 Define MLM_SETSEL 0x01CA Define MLM_QUERYSEL 0x01CB Define MLM_QUERYSELTEXT 0x01CC Define MLM_QUERYUNDO 0x01CD Define MLM_UNDO 0x01CE Define MLM_RESETUNDO 0x01CF Define MLM_QUERYFONT 0x01D0 Define MLM_SETFONT 0x01D1 Define MLM_SETTEXTCOLOR 0x01D2 Define MLM_QUERYTEXTCOLOR 0x01D3 Define MLM_SETBACKCOLOR 0x01D4 Define MLM_QUERYBACKCOLOR 0x01D5 Define MLM_QUERYFIRSTCHAR 0x01D6 Define MLM_SETFIRSTCHAR 0x01D7 Define MLM_CUT 0x01D8 Define MLM_COPY 0x01D9 Define MLM_PASTE 0x01DA Define MLM_CLEAR 0x01DB Define MLM_ENABLEREFRESH 0x01DC Define MLM_DISABLEREFRESH 0x01DD Define MLM_SEARCH 0x01DE Define MLM_QUERYIMPORTEXPORT 0x01DF Group TitleBar 1 Define TBM_SETHILITE 0x01E3 Define TBM_QUERYHILITE 0x01E4 Group SpinButton 1 Define SPBM_OVERRIDESETLIMITS 0x0200 Define SPBM_QUERYLIMITS 0x0201 Define SPBM_SETTEXTLIMIT 0x0202 Define SPBM_SPINUP 0x0203 Define SPBM_SPINDOWN 0x0204 Define SPBM_QUERYVALUE 0x0205 Define SPBN_UPARROW 0x020A Define SPBN_DOWNARROW 0x020B Define SPBN_ENDSPIN 0x020C Define SPBN_CHANGE 0x020D Define SPBN_SETFOCUS 0x020E Define SPBN_KILLFOCUS 0x020F Group Help/IPF 1 Define HM_DISMISS_WINDOW 0x0221 Define HM_DISPLAY_HELP 0x0222 Define HM_EXT_HELP 0x0223 Define HM_SET_ACTIVE_WINDOW 0x0224 Define HM_LOAD_HELP_TABLE 0x0225 Define HM_CREATE_HELP_TABLE 0x0226 Define HM_SET_HELP_WINDOW_TITLE 0x0227 Define HM_SET_SHOW_PANEL_ID 0x0228 Define HM_REPLACE_HELP_FOR_HELP 0x0229 Define HM_HELP_INDEX 0x022A Define HM_HELP_CONTENTS 0x022B Define HM_KEYS_HELP 0x022C Define HM_SET_HELP_LIBRARY_NAME 0x022D Define HM_SET_OBJCOM_WINDOW 0x0238 Define HM_UPDATE_OBJCOM_WINDOW_CHAIN 0x0239 Define HM_QUERY_DDF_DATA 0x023A Define HM_INVALIDATE_DDF_DATA 0x023B Define HM_QUERY 0x023C Define HM_SET_COVERPAGE_SIZE 0x023D Define HM_ERROR 0x022E Define HM_HELPSUBITEM_NOT_FOUND 0x022F Define HM_QUERY_KEYS_HELP 0x0230 Define HM_TUTORIAL 0x0231 Define HM_EXT_HELP_UNDEFINED 0x0232 Define HM_ACTIONBAR_COMMAND 0x0233 Define HM_INFORM 0x0234 Define HM_NOTIFY 0x0242 Define HM_SET_USERDATA 0x0243 Define HM_CONTROL 0x0244 Group DragDrop 1 Define DM_DROP 0x032F Define DM_DRAGOVER 0x032E Define DM_DRAGLEAVE 0x032D Define DM_DROPHELP 0x032C Define DM_ENDCONVERSATION 0x032B Define DM_PRINT 0x032A Define DM_RENDER 0x0329 Define DM_RENDERCOMPLETE 0x0328 Define DM_RENDERPREPARE 0x0327 Define DM_DRAGFILECOMPLETE 0x0326 Define DM_EMPHASIZETARGET 0x0325 Define DM_DRAGERROR 0x0324 Define DM_FILERENDERED 0x0323 Define DM_RENDERFILE 0x0322 Define DM_DRAGOVERNOTIFY 0x0321 Group Container 1 Define CM_ALLOCDETAILFIELDINFO 0x0330 Define CM_ALLOCRECORD 0x0331 Define CM_ARRANGE 0x0332 Define CM_ERASERECORD 0x0333 Define CM_FILTER 0x0334 Define CM_FREEDETAILFIELDINFO 0x0335 Define CM_FREERECORD 0x0336 Define CM_HORZSCROLLSPLITWINDOW 0x0337 Define CM_INSERTDETAILFIELDINFO 0x0338 Define CM_INSERTRECORD 0x0339 Define CM_INVALIDATEDETAILFIELDINFO 0x033A Define CM_INVALIDATERECORD 0x033B Define CM_PAINTBACKGROUND 0x033C Define CM_QUERYCNRINFO 0x033D Define CM_QUERYDETAILFIELDINFO 0x033E Define CM_QUERYDRAGIMAGE 0x033F Define CM_QUERYRECORD 0x0340 Define CM_QUERYRECORDEMPHASIS 0x0341 Define CM_QUERYRECORDFROMRECT 0x0342 Define CM_QUERYRECORDRECT 0x0343 Define CM_QUERYVIEWPORTRECT 0x0344 Define CM_REMOVEDETAILFIELDINFO 0x0345 Define CM_REMOVERECORD 0x0346 Define CM_SCROLLWINDOW 0x0347 Define CM_SEARCHSTRING 0x0348 Define CM_SETCNRINFO 0x0349 Define CM_SETRECORDEMPHASIS 0x034A Define CM_SORTRECORD 0x034B Define CM_OPENEDIT 0x034C Define CM_CLOSEEDIT 0x034D Define CM_COLLAPSETREE 0x034E Define CM_EXPANDTREE 0x034F Define CM_QUERYRECORDINFO 0x0350 Group Notebook 1 Define BKM_CALCPAGERECT 0x0353 Define BKM_DELETEPAGE 0x0354 Define BKM_INSERTPAGE 0x0355 Define BKM_INVALIDATETABS 0x0356 Define BKM_TURNTOPAGE 0x0357 Define BKM_QUERYPAGECOUNT 0x0358 Define BKM_QUERYPAGEID 0x0359 Define BKM_QUERYPAGEDATA 0x035A Define BKM_QUERYPAGEWINDOWHWND 0x035B Define BKM_QUERYTABBITMAP 0x035C Define BKM_QUERYTABTEXT 0x035D Define BKM_SETDIMENSIONS 0x035E Define BKM_SETPAGEDATA 0x035F Define BKM_SETPAGEWINDOWHWND 0x0360 Define BKM_SETSTATUSLINETEXT 0x0361 Define BKM_SETTABBITMAP 0x0362 Define BKM_SETTABTEXT 0x0363 Define BKM_SETNOTEBOOKCOLORS 0x0364 Define BKM_QUERYPAGESTYLE 0x0365 Define BKM_QUERYSTATUSLINETEXT 0x0366 Group Slider 1 Define SLM_ADDDETENT 0x0369 Define SLM_QUERYDETENTPOS 0x036A Define SLM_QUERYSCALETEXT 0x036B Define SLM_QUERYSLIDERINFO 0x036C Define SLM_QUERYTICKPOS 0x036D Define SLM_QUERYTICKSIZE 0x036E Define SLM_REMOVEDETENT 0x036F Define SLM_SETSCALETEXT 0x0370 Define SLM_SETSLIDERINFO 0x0371 Define SLM_SETTICKSIZE 0x0372 Group ValueSet 1 Define VM_QUERYITEM 0x0375 Define VM_QUERYITEMATTR 0x0376 Define VM_QUERYMETRICS 0x0377 Define VM_QUERYSELECTEDITEM 0x0378 Define VM_SELECTITEM 0x0379 Define VM_SETITEM 0x037A Define VM_SETITEMATTR 0x037B Define VM_SETMETRICS 0x037C Group ExtMouseButtons 1 Define WM_CHORD 0x0410 Define WM_BUTTON1MOTIONSTART 0x0411 Define WM_BUTTON1MOTIONEND 0x0412 Define WM_BUTTON1CLICK 0x0413 Define WM_BUTTON2MOTIONSTART 0x0414 Define WM_BUTTON2MOTIONEND 0x0415 Define WM_BUTTON2CLICK 0x0416 Define WM_BUTTON3MOTIONSTART 0x0417 Define WM_BUTTON3MOTIONEND 0x0418 Define WM_BUTTON3CLICK 0x0419 Group MouseTranslate 1 Define WM_BEGINDRAG 0x0420 Define WM_ENDDRAG 0x0421 Define WM_SINGLESELECT 0x0422 Define WM_OPEN 0x0423 Define WM_CONTEXTMENU 0x0424 Define WM_CONTEXTHELP 0x0425 Define WM_TEXTEDIT 0x0426 Define WM_BEGINSELECT 0x0427 Define WM_ENDSELECT 0x0428 Group MediaControlInterface 1 Define MM_MCINOTIFY 0x0500 Define MM_MCIPASSDEVICE 0x0501 Define MM_MCIPOSITIONCHANGE 0x0502 Define MM_MCICUEPOINT 0x0503 Define MM_MCIPLAYLISTMESSAGE 0x0504 Define MM_MCIEVENT 0x0505 Define MM_MCISYNCH 0x0506 Group SecondaryWindow 1 Define WM_INITSECONDARYWINDOW 0x0519 Group GraphicButton 1 Define GBN_BUTTONUP 0x0524 Define GBN_BUTTONDOWN 0x0525 Define GBN_BUTTONHILITE 0x0526 Define GBM_SETGRAPHICDATA 0x052A Define GBM_ANIMATE 0x052B Define GBM_SETANIMATIONRATE 0x052C Define GBM_QUERYANIMATIONACTIVE 0x052D Define GBM_QUERYANIMATIONRATE 0x052E Define GBM_SETBITMAPINDEX 0x052F Define GBM_QUERYBITMAPINDEX 0x0530 Define GBM_SETSTATE 0x0531 Define GBM_QUERYSTATE 0x0532 Define GBM_SETTEXTPOSITION 0x0533 Define GBM_QUERYTEXTPOSITION 0x0534 Define MM_TABHELP 0x054C Group CircularSlider 1 Define CSM_QUERYRANGE 0x053D Define CSM_SETRANGE 0x053E Define CSM_QUERYVALUE 0x053F Define CSM_SETVALUE 0x0540 Define CSM_QUERYRADIUS 0x0541 Define CSM_SETINCREMENT 0x0542 Define CSM_QUERYINCREMENT 0x0543 Define CSM_SETBITMAPDATA 0x0544 Define CSN_SETFOCUS 0x0548 Define CSN_CHANGED 0x0549 Define CSN_TRACKING 0x054A Define CSN_QUERYBACKGROUNDCOLOR 0x054B /* Standard message status */ Include All Exclude MouseMovement Exclude WM_QUERYFOCUSCHAIN ═══ 10. Using Trigger Messages ═══ It is possible to define messages to trigger the automatic thawing or freezing of the message list using: 1. the Message Filtering dialog 2. a profile file that you have created. Trigger messages are valuable when you only want to see the messages that occur: o up to a event o after a event o between two events (see example below) For example, to determine only the messages that are processed by the OS/2 Desktop when mouse button #1 is pressed and released: 1. Use the Freeze pull-down to stop messages from being added to the message list 2. Open the Message Filtering dialog 3. Ensure that both the WM_BUTTON1DOWN and WM_BUTTON1UP messages are currently included. 4. Select only the WM_BUTTON1DOWN message then press the Thaw pushbutton. Now when this message is seen, messages will start being added to the message list. 5. Select only the WM_BUTTON1UP message then press the Freeze pushbutton. When this message is seen, messages will stop being added to the message list. 6. Select Done to close the dialog. 7. Use the Select desktop window pull-down to select the OS/2 Desktop for spying. 8. Move the mouse cursor over a blank area of the desktop. Press and hold mouse button #1. You should see messages added to the message list. 9. Release the mouse button and the message list should freeze. This is a sample of what the previous steps generate: ┌─── Step above │ ┌─ List items   1 <<< list frozen >>> 8 <<< list thawed by trigger >>> 8 WM_BUTTON1DOWN 01EA0191 00000000 P 04801E64 8 WM_FOCUSCHANGE 8FE0CB9C 00000001 S 04801E64 8 WM_ACTIVATE 00000001 04601D64 S 04801E64 8 WM_SETSELECTION 00000001 00000000 S 04801E64 8 WM_SETFOCUS 8FE0CB9C 00000001 S 04801E64 8 CM_PAINTBACKGROUND 0003ED70 00000000 S 04801E64 8 CM_QUERYCNRINFO 0003E910 0000005C S 04801E64 8 WM_CONTROL 00708008 04801E64 S 04801E64 9 WM_BUTTON1UP 01EA0192 00000000 P 04801E64 9 <<< list frozen by trigger >>> ═══ 11. Message Filtering Dialog ═══ This dialog allows you to assign spying attributes to individual messages. All of the messages are displayed with their current attributes. Select the item(s) you want to adjust, then apply an attribute by using an attribute button. After a button is used, each item is updated in the list. Press the Done button when you have completed all assignments. Include when the message is detected, it will be added to the spy list. the message will also be examined to see if it is a triggering event Exclude when the message is detected, it will not be added to the spy list. the message's triggering attributes will not be examined Freeze when the message is detected and is currently included, it will automatically trigger the freezing of the spy list Thaw when the message is detected and is currently included, it will automatically trigger the thawing of the spy list No trigger removes automatic freeze/thaw triggering Reset resets message specific dynamic data (like how many times the message has been seen, etc) Delete deletes each message (it can NO longer be spyed..) Notes: o usually you will open this dialog after setting the filter list to a known state (using one or more the following pull-downs: Include All, Exclude All, Freeze, or Thaw) o Delete is normally used when creating custom profiles o the Color list allows you to additionally highlight messages in the spy list with a special color. Pick a color before selecting an attribute pushbutton. ═══ 12. Group Filtering Dialog ═══ This dialog allows you to assign spying attributes to messages based on their logical grouping. All of the groups are displayed with their current attributes. Select the item(s) you want to adjust, then apply an attribute by using an attribute button. After a button is used, each item is updated in the list. Press the Done button when you have completed all assignments. Include when a message in this group is detected, it will be added to the spy list Exclude when a message in this group is detected, it will never added to the spy list Delete deletes all messages defined in this group (they can NO longer be spyed..) Notes: o usually you will open this dialog after setting the filter list to a known state (using one or more the following pull-downs: Include All, or Exclude All) o Delete is normally used when creating custom profiles o the Color list allows you to additionally highlight messages in the spy list with a special color. Pick a color before selecting an attribute pushbutton. ═══ 13. Window Selection dialog ═══ This dialog allows you to select a window for spying from a list of windows who are descendents of HWND_DESKTOP and/or HWND_OBJECT. The list includes the following data: Hmq: 09112F78 Hwnd: 0000968F Linage: DSK.491.1 Class: Clock       Windows Windows │ P T Windows queue handle DeSKtop ─┤ I I class name OBJect ─┘ D D Select the window from the list that you would like to spy and then press a pushbutton: Spy HWND begins spying on the selected window's handle. Spy HMQ begins spying on the selected window's queue. Refresh refreshes the list using the current DESKTOP windows and OBJECT windows values as criteria. Cancel ends the dialog and preserves the current window/queue being spyed. ═══ 14. Message Detail dialog ═══ This dialog displays detailed information about a particular spied message. This includes displaying the message parameters in various formats as well as message specific usage information. To open this dialog, double-click mouse button #1 on a message in the message list. ═══ 15. Notes dialog ═══ This dialog allows you to enter a text note that is then placed in the PMSPY list and possible the LOG file. You can use these notes to document what is happening, the beginning or end of a test case, etc. Enter the desired note text then press one of the pushbuttons. OK This will accept the note text that you have entered. If you have entered text, it will be placed in the PMSPY list and remembered as the default note text for the next dialog invocation. If you have not entered text, you will be warned by a beep. Cancel This will cancel the dialog. All note text is discarded. ═══ 16. Font dialog ═══ This dialog allows you to select the non-proportional font to be used in the PMSPY message list and dialogs. Select the desired font then press one of the pushbuttons. OK The PMSPY list will change to use the selected font. Cancel This will cancel the dialog. All note text is discarded. ═══ 17. File ═══ This item allows you to work with: o A profile file that you have created. o A log file for saving the message list contents on disk. o The default profile ═══ 18. Message profile ═══ This pull-down allows you to work with profile files that you have created. ═══ 19. Open, replace current ═══ This pull-down allows you to open a profile file that you have created. It totally replaces the current profile. You would want to replace the current profile to ensure that only the specific messages that you are interested in are defined. A file open dialog is opened to let you select the desired profile file. ═══ 20. Open, append to current ═══ This pull-down allows you to open a profile file that you have created. It is appended to the current profile. You would want to append to the current profile to only incrementally add application specific messages to those that are currently defined. For example, you may create a profile for your application's WM_USER and above messages. You would then append that to the PMSPY default profile to be able to process standard PM as well as application unique messages. A file open dialog is opened to let you select the desired profile file. ═══ 21. Save current ═══ This pull-down allows you to save the current profile in a disk file. For example, you may want to create a custom profile. After starting PMSPY you would then select this pull-down to save the default profile in a disk file. A file open dialog is opened to let you select the desired profile file. ═══ 22. Log file ═══ This pull-down allows you to work with a log file ═══ 23. Open ═══ This pull-down allows you to open a log file for saving the message list contents on disk. The log file provides an added debugging and/or learning opportunity because it contains all of the messages and notes that have occurred since the log file was opened. A file open dialog is opened to let you select the desired log file. ═══ 24. Open with list snapshot ═══ This pull-down allows you to open a log file for saving the message list contents on disk. After the log file is opened, the current contents of the message list is written to it. This after the fact logging can be a very useful debug aid. The log file provides an added debugging and/or learning opportunity because it contains all of the messages and notes that have occurred since the log file was opened. A file open dialog is opened to let you select the desired log file. ═══ 25. Close ═══ This pull-down allows you to close the log file. ═══ 26. Default message profile ═══ This pull-down allows you to work with the default profile file shipped with PMSPY. ═══ 27. Open, replace current ═══ This pull-down allows you to totally replace the current profile with the default profile file. You would want to replace the current profile to restore PMSPY back to its startup state. ═══ 28. Open, append to current ═══ This pull-down allows you to append the current profile with the default profile file. This would add the standard set of PM messages. Since PMSPY has already defined the standard messages, this is one less thing that you as an application developer have to worry about. ═══ 29. Browse ═══ This pull-down allows you to browse the default profile file. This provides a handy reference to all of the standard PM messages (including their hex values). ═══ 30. Exit ═══ This pull-down allows you to exit PMSPY. Note: If you select this pull-down, the current agent characteristics are saved. ═══ 31. Spyon ═══ This item allows you to: o Select the window to spy on o Stop spying on a window ═══ 32. Select desktop window ═══ This pull-down allows you to select a visible window from the desktop for spying. The pointer changes to a cross-hair to indicate that window selection is in progress. If mouse moves over the current PMSPY window, the pointer changes to an illegal pointer. Position the pointer over the window you wish to spy and use one of the following mouse actions to complete the selection process: ┌───────┬────────────────────┐ │Mouse │What happens then │ │action │ │ ├───────┼────────────────────┤ │single │The window and queue│ │click │handles will be │ │button │retrieved for that │ │#1 │window and spying │ │ │will begin as │ │ │messages move │ │ │through the queue or│ │ │are sent to the │ │ │window. The window │ │ │or queue handle will│ │ │be displayed in the │ │ │PMSPY titlebar. │ ├───────┼────────────────────┤ │single │Reveals the class │ │click │name, window and │ │button │queue handles for │ │#2 │the window beneath │ │ │the cursor. The │ │ │selection process │ │ │remains active. │ │ │This is a handy way │ │ │to explore the │ │ │current set of │ │ │windows. │ ├───────┼────────────────────┤ │double │Cancels the │ │click │selection of a │ │button │window. │ │#2 │ │ └───────┴────────────────────┘ ═══ 33. Select any window ═══ This pull-down displays a list of windows who are descendents of HWND_DESKTOP and/or HWND_OBJECT. A window or queue can then be selected list for spying. ═══ 34. System message queue ═══ This pull-down allows you to select the PM system message queue for spying. This allows you to spy all windows and application message queues at once. W A R N I N G Since spying on the system message queue can greatly affect PM and/or application operation, it is recommended that all unnecessary PM messages be excluded from spying before using this selection. Only the minimum required subset of messages should be included. ═══ 35. Deselect current ═══ This pull-down allows you to stop spying on the selected window or queue. ═══ 36. SpyWhat ═══ This item allows you to: o Spy on the selected window only o Spy on all windows supported by the current message queue ═══ 37. Spy on window ═══ This pull-down limits the spying of messages to only those destined for the current window or OBJECT. Any message not destined for that specific window is ignored. ═══ 38. Spy on queue ═══ This pull-down expands the spying scope to include messages for all windows supported by the current message queue. This capability to examine all windows is required if you desire to debug dialogs. ═══ 39. Options ═══ This item allows you to: o Control the message list o Control the log file o Add a text note * ═══ 40. Spy list ═══ This set of pull-downs allow you to control message list operations. ═══ 41. Clear ═══ This pull-down clears all of the messages and/or notes from the message list. You may want to clear the list as part of the setup for debugging a special problem. ═══ 42. Freeze ═══ This pull-down freezes the message list. This means that no new messages will be automatically added to the list until either: 1. you manually thaw the message list 2. a trigger message automatically thaws the message list ═══ 43. Thaw ═══ This pull-down thaws a previously frozen message list. This means that new, eligible messages will again be automatically added to the list until either: 1. you manually freeze the message list 2. a trigger message automatically freezes the message list ═══ 44. Auto scroll? ═══ This pull-down represents the automatic scrolling state of the message list. When checked, the message list will automatically scroll to keep the last added message visible. This is the default setting. When not checked, the list does not automatically scroll to keep the last added message visible. This is useful when you need to examine the messages that have previously been added to the list and do not want to be bothered by the automatic scrolling that occurs when a new message is subsequently added to the list. ═══ 45. Font ═══ This pull-down presents the Font dialog so that you can select the non-proportional font used by the message list and dialogs. ═══ 46. Log file ═══ This set of pull-downs allow you to control log file operations. ═══ 47. Freeze ═══ This pull-down freezes the log file. This means that no new messages are automatically written to the file (even though they are added to the message list). ═══ 48. Thaw ═══ This pull-down thaws a previously frozen log file. This means that new messages are also automatically written to the file (as well as being added to the message list). ═══ 49. Add note ═══ This pull-down presents the Notes dialog so that you can enter a text note for addition to the message list and possibly the log file. You can use notes to document scenario setups, debugging notes, etc for later reference or debugging assistance. ═══ 50. Save options ═══ This pull-down saves this PMSPY agent's current options in PMSPY.INI. ═══ 51. Filter ═══ This item allows you to: o Control the spying of profile defined messages (on a group or individual message basis) o Control the spying of undefined messages ═══ 52. By group ═══ This pull-down presents the Group Filtering dialog so that you can select one or more groups of messages. Each group represents one or more individual messages that are logically related to each other (for instance, all titlebar messages, etc). Message groups are defined by PMSPY in the default profile or by you in a profile file. ═══ 53. By message ═══ This pull-down presents the Message Filtering dialog so that you can select one or more messages. Messages are defined by PMSPY in the default profile or by you in a profile file. ═══ 54. Exclude all messages ═══ This pull-down automatically excludes all defined messages (and groups) from being included in the message list. By itself, this function is not very useful. But when used before the Group Filtering dialog or the Message Filtering dialog it provides a quick method for placing the message filtering controls into a known state before setting up special filter combinations. ═══ 55. Include all messages ═══ This pull-down automatically enables the inclusion of all defined messages (and groups) in the message list. By itself, this function is not very useful. But when used before the Group Filtering dialog or the Message Filtering dialog it provides a quick method for placing the message filtering controls into a known state before setting up special filter combinations. ═══ 56. Include undefined messages? ═══ This pull-down allows you to spy on messages with a value less than WM_USER that have not been defined in the current profile file. This allows you to spy on other applications and see the non-standard messages that are used (for example, the messages used with a program group dialog when items are selected and dragged from one line to another). The Include undefined WM_USER pull-down allows you to just include undefined messages that begin at the WM_USER value. The following special format is used when displaying undefined messages: WM_???? (0303) 01B40372 00010001 S 03300CC8 To examine just the undefined messages, first use the Exclude all messages, then select this pull-down item. ═══ 57. Include undefined WM_USER? ═══ This pull-down allows you to spy on all messages defined at or above the WM_USER value that have not been defined in the current profile file. This allows you to spy on your (or other) applications and see the WM_USER messages being used without having to define a special profile file. The Include undefined messages? pull-down allow you to include all undefined messages. The following special format is used when displaying undefined WM_USER messages: WM_USER (1010) 01B40372 00010001 S 03300CC8 To examine just the WM_USER messages, first use the Exclude all messages, then select this pull-down item. ═══ 58. Help ═══ This item allows you to: o Obtain operational help on using PMSPY o Display PMSPY product information ═══ 59. Help for help ═══ This pull-down provides help on using the online help system. ═══ 60. Keys help ═══ This pull-down provides information about the various keyboard keys and their usage. ═══ 61. Extended help ═══ This pull-down provides extended help about PMSPY. ═══ 62. Extended index ═══ This pull-down provides an index of all help topics. ═══ 63. Product Information ═══ This pull-down provides information about this version of PMSPY. ═══ 64. WinCreateHelpInstance error ═══ An error was detected during a WinCreateHelpInstance call. ═══ 65. WinAssociateHelpInstance error ═══ An error was detected during a WinAssociateHelpInstance call. ═══ 66. IPF Processing error ═══ An IPF error was detected. ═══ 67. Too many PMSPY instances ═══ There are already 8 PMSPY agents active. No more can be started at this time. Re-use one of current PMSPY instances to process a new message queue or window. ═══ 68. Executible and "Hook" DLL Incompatible ═══ The internal versions of PMSPY.EXE and PMSPYHK.DLL are not compatible. Ensure that the LIBPATH and PATH environment variables locate compatible files. If necessary, re-install PMSPY. ═══ 69. Log file already exists ═══ The log file you selected already exists. This message requests verification before replacing the existing file. ═══ 70. Profile file already exists ═══ The profile file you selected for saving already exists. This message requests verification before replacing the existing file. ═══ 71. Spying on the PM system queue ═══ This message requests verification before beginning to spy on the PM system message queue. W A R N I N G Since spying on the system message queue can greatly affect PM and/or application operation, it is recommended that all unnecessary PM messages be excluded from spying before using this selection. Only the minimum required subset of messages should be included. ═══ 72. Profile file ═══ An optional profile can be used to define colors and message filtering options. The file is interpreted sequentially. One advantage of creating a profile for your application is that you define the message name to have the same mnemonic value as you used when you coded it (for example, WM_STARTUP_PROCESSING) It is even possible to automate the generation of application specific profiles to ensure that they remain consistent with your application code as it changes during the development cycle. For an example, look at the default profile. X Y CX CY SPYON | LIST | FONT <"10.System Monospaced"> COLOR | GROUP [] DEFINE [] INCLUDE ALL | | EXCLUDE ALL | | TRIGGER | * is 1..8 (1=default color; omit to leave default color ASIS) 1=color used for undefined messages 2=color used for undefined WM_USER messages 7=color used for NOTES 8=color used for PMSPY status messages * is a blank delimited "word" (optionally it may be enclosed in double quotes) * is a decimal, hex, or octal (for those DEC fans) number. Simple addition is also supported: WM_USER+5 * is a blank delimited "word" (optionally it may be enclosed in double quotes) ═══ 73. Command Line ═══ The following command line parameters are all optional and case insensitive. They are processed as they are found (left-to-right). PMSPY [/PRO=file] [/APP=file] /PRO=file reads as a profile and replaces the default profile. /APP=file reads as a profile and appends it to the default profile. Combinations of /PRO= /APP= may be used on one invocation to setup special filtering situations. For example, the following invocation establishes an application specific filter set composed of two groups of messages (without using the 'standard' PM message set): PMSPY /PRO=app_set1.pro /APP=app_set2.pro The first /PRO= "clears" the default message filtering set then loads the message groups defined in APP_SET1.PRO. The /APP= then adds the additional messages groups defined in APP_SET2.PRO. ═══ 74. Log file ═══ This file can be used to save the contents of the message list on disk. All messages and text notes are written to the log file if one has been opened. One advantage of using a log file is that you can view all of the messages that have occurred. Due to listbox limitations, the oldest messages are deleted from the listbox to make room for the ones currently occurring. ═══ 75. Keys Help ═══ All OS/2 keys are functional while you are using PMSPY. See the OS/2 keys help for a complete list of these keys. In addition, shortcut keys have been defined for selected PMSPY actions. These are indicated when an action bar item is selected and its pull-downs are displayed. ═══ 76. Help for Help ═══ Help is always available. The type of help you get is determined by the item selected when you requested help. When you ask for help, you will see a window containing help information. You can size or move this window like any other. You can also leave the help window visible while you do the task.