home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / sndys200.zip / sndyseng.inf (.txt) < prev    next >
OS/2 Help File  |  1996-03-01  |  66KB  |  2,169 lines

  1.  
  2. ΓòÉΓòÉΓòÉ 1. SendYes! Overview ΓòÉΓòÉΓòÉ
  3.  
  4. SendYes! V2.0
  5. Are you tired of closing message boxes which you cannot surpress by default ? 
  6. Ever got fed up by those confirmation boxes for closing text sessions ? 
  7.  
  8. Now use SendYes! to process (nearly) all standard message boxes automatically. 
  9.  
  10. Wes Santee, author of SendYes! V1.00: 
  11. "I wrote SendYes! because I hated having to sit and click the 'Yes' button 
  12. during system shutdown to close all of my windowed text sessions that were 
  13. open. " 
  14.  
  15. SendYes! is a small utility that looks for message boxes and waits, until one 
  16. comes up that matches with a message text defined within the SendYes!. It then 
  17. performs an action on a user selected pushbutton, which can be: pressing that 
  18. button, setting that button as the default button or deactivating that button. 
  19.  
  20. The definition of a message text together with an associated action is stored 
  21. as an action profile within SendYes!. You can define as many action profiles 
  22. within SendYes! as you like... 
  23.  
  24. The first versions of SendYes! were designed to close only the confirmation 
  25. message boxes that pop up whenever OS/2 is closing a DOS or OS/2 Windowed or 
  26. Fullscreen Text session. This was achieved by sending a PM message to the yes 
  27. button that it was pressed, so that way the utility got it's name. 
  28. This feature as a subset of the current functionality is supported by 
  29. predefined action profiles. If you activate these action profiles SendYes! will 
  30. close the confirmation message boxes as in earlier versions. 
  31.  
  32.  
  33. ΓòÉΓòÉΓòÉ 2. Requirements ΓòÉΓòÉΓòÉ
  34.  
  35. SendYes! has been tested on OS/2 V2.11 and OS/2 Warp 3.0 for detecting message 
  36. boxes and performing actions on them. It makes several assumptions as to the 
  37. resource IDs of the message text and icon contained in a standard message box. 
  38. If these resource IDs change in future versions of OS/2, SendYes! will not work 
  39. under them and must be changed for that new version. At least until now these 
  40. IDs did not change at all ... 
  41.  
  42. Furthermore SendYes! reads the message texts for some predefined action 
  43. profiles out of PM resource DLLs. If the resource IDs for these message texts 
  44. change, the predefined action profiles will not longer contain the correct 
  45. message texts and so they will not longer work, but you will still be able to 
  46. define action profiles which enable SendYes! to process the message boxes for 
  47. which the predefined action profiles ares used. 
  48.  
  49. For more information on predefined action profiles and how to test, if they 
  50. work, refer to section 
  51.  
  52.       predefined action profiles 
  53.  
  54.  
  55. ΓòÉΓòÉΓòÉ 3. The SendYes! package ΓòÉΓòÉΓòÉ
  56.  
  57. The SendYes! package contains the following files: 
  58.  
  59.  
  60. readme.cmd            displays the "SendYes! Overview" of this INF file
  61. install.cmd           calls the installation program
  62. sendyes.exe           the GUI executable
  63. sndyshk.bin           the hook executable
  64. sndysdll.dll          the hook DLL
  65.  
  66. sndyseng.dll          english resource library
  67. sndyseng.hlp          english help file
  68. sndyseng.inf          english online book
  69.  
  70. sndysger.dll          german resource library
  71. sndysger.hlp          german help file
  72. sndysger.inf          german online book
  73.  
  74. nlssrc.zip            zip file containing the sourcefiles for the
  75.                       national language support
  76.  
  77. install\install.cmd   install program for the SendYes! WPS program objects
  78. install\remove.cmd    deinstall program for the SendYes! WPS program objects
  79. install\sndyseng.msg  english install messagefile
  80. install\sndysger.msg  german install messagefile
  81. install\*.ico         some icons used by the install and the deinstall program
  82.  
  83. Note: 
  84.  
  85.      you can delete the the language specific files for languages which you 
  86.       don't use with SendYes! 
  87.  
  88.  
  89. ΓòÉΓòÉΓòÉ 4. Copyright & Co. ΓòÉΓòÉΓòÉ
  90.  
  91. Copyright 
  92. general license 
  93. shareware license 
  94. Disclaimer 
  95.  
  96.  
  97. ΓòÉΓòÉΓòÉ 4.1. Copyright ΓòÉΓòÉΓòÉ
  98.  
  99. SendYes! Copyright (C) Christian Langanke 1996 
  100.  
  101. You are welcome to send your comments/suggestions via internet e-mail. 
  102.  
  103. Send your email to cla@oerag.de 
  104.  
  105.  
  106. ΓòÉΓòÉΓòÉ 4.2. general license ΓòÉΓòÉΓòÉ
  107.  
  108. SendYes! is freeware for noncommercial use and shareware for use in a 
  109. commercial environment. 
  110.  
  111. You are allowed to freely use SendYes! as long as 
  112.  
  113.      SendYes! is used in a noncommercial environment 
  114.  
  115.  You are allowed to freely distribute SendYes! as long as 
  116.  
  117.      SendYes! is not sold as a part of another program package 
  118.      no fee is charged for the program other than for cost of media 
  119.      the complete package is distributed unmodified 
  120.      you send me some e-mail telling me how you liked it (or didn't like it) 
  121.       and/or with your suggestions for enhancements. 
  122.  
  123.       I'd like especially to hear from you if you would like to help me to 
  124.       enable SendYes! to support your language if that is not yet done. 
  125.  
  126.       Refer to section 
  127.            national language support 
  128.  
  129.  
  130. ΓòÉΓòÉΓòÉ 4.3. shareware license ΓòÉΓòÉΓòÉ
  131.  
  132. You may use SendYes! in a commercial environment only, if you agree to the 
  133. following terms in addition to the general license : 
  134.  
  135.      If you continue to use SendYes! after a trial period of 30 days, you 
  136.       register it and pay a registration fee of 5$ for 
  137.  
  138.         -  every copy of the SendYes! package, that you use on a standalone 
  139.            computer at a time 
  140.         -  every user, that can access an installed SendYes! package via a 
  141.            network at a time. You are responsible to ensure that only that 
  142.            amount of users can access an installed SendYes! package at a time, 
  143.            that you registered for. Or in other words, you have to register for 
  144.            every user, that can access an installed SendYes! package at a time. 
  145.  
  146.      If you don't register SendYes! after the trial period of 30 days, you 
  147.       delete all installed copies of the program 
  148.  
  149.  The registration will allow you to use SendYes! up to V2.99. 
  150.  
  151.  Contact the author for discounts and site licenses. 
  152.  
  153.  
  154. ΓòÉΓòÉΓòÉ 4.4. Disclaimer ΓòÉΓòÉΓòÉ
  155.  
  156. Since this program is free, it is supplied with no warranty, either expressed 
  157. or implied. 
  158.  
  159. I disclaim all warranties for any damages included but not limited to 
  160. incidental or consequential damage caused directly or indirectly by this 
  161. software. 
  162.  
  163. All software is supplied AS IS. You may use the SendYes! package only at your 
  164. own risk. 
  165.  
  166. SendYes! must not be used in states that do not allow the above limitation of 
  167. liability. 
  168.  
  169.  
  170. ΓòÉΓòÉΓòÉ 5. Installation ΓòÉΓòÉΓòÉ
  171.  
  172. copy files 
  173. installation program 
  174. deinstallation program 
  175.  
  176.  
  177. ΓòÉΓòÉΓòÉ 5.1. copy files ΓòÉΓòÉΓòÉ
  178.  
  179. If you received the SendYes! package as a ZIP file, create a directory for the 
  180. files of the SendYes! package on your harddisk and unzip all files from the ZIP 
  181. file into it. 
  182.  
  183. Make sure that the directory structure stored within the ZIP file is preserved. 
  184.  
  185.  
  186. ΓòÉΓòÉΓòÉ 5.2. installation program ΓòÉΓòÉΓòÉ
  187.  
  188. To create a SendYes! folder with precustomized program objects in it, execute 
  189. the following steps: 
  190.  
  191.    1. open an OS/2 Window 
  192.    2. change into the directory, where the files of the SendYes! package reside 
  193.    3. change into the subdirectory INSTALL 
  194.    4. run the command 
  195.            install 
  196.  
  197.  Within the installation program you can select the language to be used by the 
  198.  program. 
  199.  
  200.  The installation program creates the SendYes! folder with several SendYes! WPS 
  201.  program objects. 
  202.  
  203.  Note: 
  204.  
  205.      If you want to change the location of the files of the SendYes! package, 
  206.       move the SendYes! directory to the new location and rerun the 
  207.       installation program to update the SendYes! WPS program objects. 
  208.  
  209.  
  210. ΓòÉΓòÉΓòÉ 5.3. deinstallation program ΓòÉΓòÉΓòÉ
  211.  
  212. To remove all SendYes! WPS program objects, 
  213.  
  214.      execute the icon SendYes! WPS deinstallation program 
  215.  
  216.      or execute the following steps: 
  217.  
  218.         1. open an OS/2 Window 
  219.         2. change into the directory, where the files of the SendYes! package 
  220.            reside 
  221.         3. change into the subdirectory INSTALL 
  222.         4. run the command 
  223.                 remove 
  224.  
  225.  
  226.  Note: 
  227.  
  228.      The SendYes! WPS deinstallation program does not remove any files from 
  229.       your harddisk. To completely deinstall SendYes! you must also remove the 
  230.       files of the SendYes! package. 
  231.  
  232.  
  233. ΓòÉΓòÉΓòÉ 6. Usage ΓòÉΓòÉΓòÉ
  234.  
  235. action profiles 
  236. predefined action profiles 
  237. SendYes! GUI 
  238. SendYes! WPS program objects 
  239. commandline parameters 
  240.  
  241.  
  242. ΓòÉΓòÉΓòÉ 6.1. action profiles ΓòÉΓòÉΓòÉ
  243.  
  244. The SendYes! graphical user interface allows the user to create, copy, edit and 
  245. delete action profiles. Action profiles consist of the following data: 
  246.  
  247.      the message text of the message box which is to be intercepted 
  248.  
  249.      the pushbutton to act on. All possible pushbuttons for standard message 
  250.       boxes can be selected and it is the users responsibility to select a 
  251.       pushbutton which is really part of the message box to be processed 
  252.       automatically. 
  253.  
  254.      the action to take. This can be: 
  255.  
  256.         -  pressing the button 
  257.         -  setting the button as the default button and set the focus on it 
  258.  
  259.            Note:   This action is perfomed only once when the message box comes 
  260.            up for the first time 
  261.  
  262.         -  disabling the button 
  263.  
  264.       Note: 
  265.  
  266.         -  The message text of an action profile must be unique among all 
  267.            action profiles so that only one action profile exists for every 
  268.            message box that can come up. 
  269.         -  the message text of predefined action profiles cannot be edited. 
  270.            However the pushhbutton to act on and the action to take can be 
  271.            changed. 
  272.         -  The action you select is performed on the button you select every 
  273.            time the message box receives the focus (except for setting the 
  274.            pushbutton as the default pushbutton, that is done only once). 
  275.            So it is not very useful to select pressing the help button, 
  276.            although it is possible. If you use an action profile set up like 
  277.            this, it will activate the help every time you click onto the 
  278.            message box, because then the message box receives the focus and the 
  279.            selected action is performed. 
  280.            In that case close the message box first and then the help window. 
  281.  
  282.  
  283. ΓòÉΓòÉΓòÉ 6.2. predefined action profiles ΓòÉΓòÉΓòÉ
  284.  
  285. Predefined action profiles are different from user defined action profiles: 
  286.  
  287.      SendYes! creates and displays them automatically the first time it is 
  288.       started 
  289.  
  290.      they cannot be deleted 
  291.  
  292.      their message text is read out of PM resources and cannot be edited 
  293.  
  294.  However the pushhbutton to act on and the action to take can be changed for 
  295.  predefined action profiles. 
  296.  
  297.  As the message texts for these predefined action profiles are read out of PM 
  298.  resources, they will work under every OS/2 WARP version, no matter what 
  299.  language specific version you use. Also the INI file that SendYes! creates to 
  300.  store it's action profiles will not contain these message texts, so this file 
  301.  can be exchanged between users of OS/2 versions of different language. 
  302.  
  303.  The predefined action profiles are first of all for to support the 
  304.  functionality of previous versions of SendYes! without enforcing the user to 
  305.  set up action profiles for that himself. 
  306.  
  307.  To enable the user to distinct between predefined and user defined action 
  308.  profiles, every predefined action profile entry is displayed with a preceeding 
  309.  label. 
  310.  
  311.  In the current version SendYes! comes with the following predefined action 
  312.  profiles for to process confirmation message boxes for: 
  313.  
  314.      closing an OS/2 windowed text session. With this action profile activated 
  315.       also confirmation message boxes for closing both DOS windowed and 
  316.       fullscreen text sessions are processed. 
  317.       This action profile is labeled OS/2 win close 
  318.  
  319.      closing an OS/2 fullscreen text session. 
  320.       This action profile is labeled OS/2 fs close 
  321.  
  322.      shutdown. 
  323.       This action profile is labeled shutdown 
  324.  
  325.  To find out wether the predefined action profiles of SendYes! are working on 
  326.  your OS/2 for closing a DOS or OS/2 Windowed or Fullscreen Text session 
  327.  without confirmation message boxes, refer to section 
  328.  
  329.       How can I test predefined action profiles ? 
  330.  
  331.  If all text sessions close well without confirmation boxes, everything is 
  332.  fine. 
  333.  If not, please email and tell me so... 
  334.  Meanwhile you can define an action profile which will close these textsessions 
  335.  without confirmation boxes on YOUR system. 
  336.  
  337.  
  338. ΓòÉΓòÉΓòÉ 6.3. SendYes! GUI ΓòÉΓòÉΓòÉ
  339.  
  340. The SendYes! GUI consists of a notebook control, which can nearly be used like 
  341. a settings notebook of a WPS object. This notebook comes up if you start 
  342. SendYes! without any parameters or execute the icon SendYes!. 
  343.  
  344. Note:   Only one instance of the SendYes! GUI can be active at a time. 
  345.  
  346. The notebook contains two notebook pages and a common dialog is used for to 
  347. create, copy or edit action profiles: 
  348.  
  349.      Session Page 
  350.      Actions Page 
  351.      New / Edit / Copy Dialog 
  352.  
  353.  
  354. ΓòÉΓòÉΓòÉ 6.3.1. Session Page ΓòÉΓòÉΓòÉ
  355.  
  356. On this page you can 
  357.  
  358.      start the SendYes! hook executable and thus activate the SendYes! 
  359.       functionality. 
  360.  
  361.       Use the checkbox activate SendYes! to activate or deactivate SendYes! 
  362.  
  363.      define wether the SendYes! hook executable is loaded by a separate 
  364.       process or by the PMSHELL process 
  365.  
  366.       Note:   In the current version of SendYes! the hook executable is always 
  367.       loaded by a separate process, so this setting cannot be changed 
  368.  
  369.      define wether the SendYes! hook executable is unloaded on deactivation or 
  370.       not 
  371.  
  372.       Note:   In the current version of SendYes! the hook executable is always 
  373.       unloaded on deactivation, so this setting cannot be changed 
  374.  
  375.  
  376. ΓòÉΓòÉΓòÉ 6.3.2. Actions Page ΓòÉΓòÉΓòÉ
  377.  
  378. On this page you can define action profiles, and activate or deactivate self 
  379. defined and predefined action profiles. All profiles are placed in two lists: 
  380.  
  381.      the list labeled Defined action profiles contains defined action 
  382.       profiles, which are not active. 
  383.  
  384.       Profiles located in this list can be activated, edited, copied or deleted 
  385.       and new action profiles can be created. 
  386.  
  387.       Note:   Predefined action profiles cannot be deleted and their message 
  388.       text cannot be edited. 
  389.  
  390.      the list labeled Active action profiles contains activated action 
  391.       profiles. If the SendYes! hook executable is activated on the Session 
  392.       Page, the action profiles are executed when the apropriate message boxes 
  393.       come up. 
  394.  
  395.       Action profiles in this list can only be edited, deleted or deactivated. 
  396.       Creating new action profiles or copying existing profiles is possible 
  397.       only within the list labeled Defined action profiles. 
  398.       Also the predefined action profiles for closing text sessions (and only 
  399.       those) can be tested: 
  400.       SendYes! then creates the appropriate text sessions which you can close 
  401.       easily via the window list. 
  402.  
  403.       Note:   Predefined action profiles cannot be deleted and their message 
  404.       text cannot be edited. 
  405.  
  406.  Although you can manipulate action profiles either with the keyboard or with 
  407.  the mouse, the usage of the mouse is far easier. The new enhanced listbox 
  408.  controls, which incorporate the functionality of the Direct Manipulation 
  409.  ListBox (DMLB) control and the MultiColumn ListBox (MCLB) control, allow to 
  410.  use the mouse as follows: 
  411.  
  412.      use the right mouse button within the lists to bring up context menus for 
  413.       to perform the actions on action profiles as described above. 
  414.  
  415.      as an alternative for some actions within the context menus use 
  416.       drag&drop: 
  417.  
  418.         -  between both lists for to activate or deactivate action profiles. 
  419.         -  within the list labeled Defined action profiles for to copy an 
  420.            existing action profile. 
  421.  
  422.  For more information on how to manipulate action profiles refer to section 
  423.  
  424.       How can I ... ? 
  425.  
  426.  SendYes! comes with predefined action profiles for being able to process some 
  427.  standard system message boxes. You can test some of them for to make sure that 
  428.  they work properly. 
  429.  
  430.  Refer to section 
  431.  
  432.       predefined action profiles 
  433.       How can I test predefined action profiles ? 
  434.  
  435.  
  436. ΓòÉΓòÉΓòÉ 6.3.3. New / Edit / Copy Dialog ΓòÉΓòÉΓòÉ
  437.  
  438. Within this dialog you can create a new or copy or edit existing action 
  439. profiles. 
  440.  
  441.  
  442. ΓòÉΓòÉΓòÉ 6.4. SendYes! WPS program objects ΓòÉΓòÉΓòÉ
  443.  
  444. The SendYes! WPS installation program creates the following objects: 
  445.  
  446.      a SendYes! folder on the desktop, which contains the following program 
  447.       reference objects: 
  448.  
  449.         -  Initialize SendYes! 
  450.         -  SendYes! 
  451.         -  SendYes! V2.0 Help 
  452.         -  SendYes! WPS installation program 
  453.         -  SendYes! WPS deinstallation program 
  454.  
  455.      a shadow of Initialize SendYes!, which is placed into the folder Startup, 
  456.       so that SendYes! is initialized on every startup of OS/2. For more 
  457.       information on intitializing SendYes! on system startup refer to 
  458.  
  459.            How can I initialize SendYes! ? 
  460.  
  461.      a shadow of the folder Startup, which is placed into the SendYes! folder, 
  462.       so that you can easily access this folder in order to delete the shadow 
  463.       of Initialize SendYes! or place it into the startup folder again. 
  464.  
  465.      a shadow of SendYes!, which is placed into the folder System Setup. 
  466.  
  467.  
  468. ΓòÉΓòÉΓòÉ 6.4.1. Initialize SendYes! ΓòÉΓòÉΓòÉ
  469.  
  470. This icon loads the SendYes! hook executable, if the current settings state 
  471. that SendYes! is active. A shadow of this icon is placed into the Startup 
  472. folder by the installation program so that SendYes! is initialized on every 
  473. system startup. 
  474. For more information on intitializing SendYes! refer to 
  475.  
  476.       How can I initialize SendYes! ? 
  477.  
  478.  Note: 
  479.  
  480.      If the environment variable RESTARTOBJECTS is set to the value of NO 
  481.       within CONFIG.SYS, objects residing in the Startup folder are not 
  482.       processed automatically on System Startup. Then SendYes! must be 
  483.       initialised via a call in STARTUP.CMD or manually initialised. 
  484.       For more information on intitializing SendYes! on system startup refer to 
  485.            How can I initialize SendYes! ? 
  486.      You can load the SendYes! hook executable also via the SendYes! GUI by 
  487.       performing the following steps: 
  488.         1. open the SendYes! GUI 
  489.         2. select the Session Page 
  490.         3. check the checkbox labeled activate SendYes! 
  491.         4. the status field above the pushbuttons displays the new status of 
  492.            SendYes!, if SendYes! was able to load the hook executable. 
  493.      No notification message box is displayed. Only in case of errors an error 
  494.       message box is displayed. 
  495.      This icon is equivalent to executing 
  496.            [start] SENDYES /INITIALIZE 
  497.       on the commandline in the SendYes! directory. 
  498.  
  499.  
  500. ΓòÉΓòÉΓòÉ 6.4.2. SendYes! ΓòÉΓòÉΓòÉ
  501.  
  502. This icon starts the SendYes! GUI, where you can modify the current settings of 
  503. the program. 
  504.  
  505. Note: 
  506.  
  507.      This icon is equivalent to executing 
  508.            [start] SENDYES 
  509.       on the commandline in the SendYes! directory. 
  510.  
  511.  
  512. ΓòÉΓòÉΓòÉ 6.4.3. SendYes! V2.0 Help ΓòÉΓòÉΓòÉ
  513.  
  514. This icon brings up this INF file. 
  515.  
  516. Note: 
  517.  
  518.      This icon is equivalent to executing 
  519.            README 
  520.       on the commandline in the SendYes! directory. This will display the INF 
  521.       file for the currently selected language. 
  522.      You can also display a language specific INF file directly by executing 
  523.            README ??? or 
  524.            [start] view sndys??? 
  525.       on the commandline in the SendYes! directory, where ??? is an english 
  526.       three letter abbreviation of the desired language. For more information 
  527.       about available INF files refer to section 
  528.            The SendYes! package 
  529.  
  530.  
  531. ΓòÉΓòÉΓòÉ 6.4.4. SendYes! WPS installation program ΓòÉΓòÉΓòÉ
  532.  
  533. This icon executes the installation program for the SendYes! WPS program 
  534. objects. 
  535.  
  536. Within this program you can select the language used by SendYes! and recreate 
  537. the SendYes! WPS program objects, so that newly selected language is used for 
  538. the object titles. 
  539.  
  540.  
  541. ΓòÉΓòÉΓòÉ 6.4.5. SendYes! WPS deinstallation program ΓòÉΓòÉΓòÉ
  542.  
  543. This icon executes the deinstallation program for the SendYes! WPS program 
  544. objects. 
  545.  
  546. With this program you can remove the SendYes! WPS program objects. 
  547.  
  548. Note: 
  549.  
  550.      The SendYes! WPS deinstallation program does not remove any files from 
  551.       your harddisk. To completely deinstall SendYes! you must also remove the 
  552.       files of the SendYes! package. 
  553.  
  554.  
  555. ΓòÉΓòÉΓòÉ 6.5. commandline parameters ΓòÉΓòÉΓòÉ
  556.  
  557. The following parameters can be used to interact with SendYes! from the 
  558. commandline: 
  559.  
  560.  /INITIALIZE 
  561.  /LOAD                    /STATUS 
  562.  /UNLOAD                  /BATCH 
  563.  /ACTIVATE                /QUIET 
  564.  /DEACTIVATE              /? 
  565.  
  566.  General notes on switch parameters: 
  567.  
  568.      the parameter names are used case insensitive 
  569.      Instead of slashes you can also use the minus sign - that means that for 
  570.       example specifying /load and -load is equivalent 
  571.      it is sufficient to specify only the first character of the parameter 
  572.       name - that means that /b and /batch (or -b and -batch) are also 
  573.       equivalent. 
  574.  
  575.  
  576. ΓòÉΓòÉΓòÉ 6.5.1. /INITIALIZE ΓòÉΓòÉΓòÉ
  577.  
  578. This parameter is for to initialize SendYes! on system startup. 
  579.  
  580. If the current SendYes! settings state that the hook executable should be 
  581. active, SendYes! acts as if the parameter /LOAD was specified. 
  582.  
  583. Note: 
  584.  
  585.      No notification message box is displayed. Only in case of errors an error 
  586.       message box is displayed. 
  587.  
  588.  
  589. ΓòÉΓòÉΓòÉ 6.5.2. /LOAD ΓòÉΓòÉΓòÉ
  590.  
  591. This parameter loads the SendYes! hook executable, if it is not already loaded. 
  592. If the hook executable can be loaded successfully, the SendYes! functionality 
  593. is available and message boxes, which apply to activated action profiles, are 
  594. processed automatically. 
  595.  
  596. Note: 
  597.  
  598.      If the hook executable can be loaded successfully, a notification message 
  599.       box is displayed. 
  600.      If the hook executable is already loaded or cannot be loaded, an error 
  601.       message box is displayed. 
  602.      Both the notification and the error message box can be surpressed by also 
  603.       specifiying the parameter /BATCH. Instead a notification or an error beep 
  604.       is generated. 
  605.  
  606.       In addition the notification and error beeps can be supressed with the 
  607.       parameter /QUIET. 
  608.  
  609.  
  610. ΓòÉΓòÉΓòÉ 6.5.3. /UNLOAD ΓòÉΓòÉΓòÉ
  611.  
  612. This parameter unloads the SendYes! hook executable, if it is active. When the 
  613. hook executable is unloaded, the SendYes! functionality is not longer available 
  614. and message boxes are no more processed automatically. 
  615.  
  616. Note: 
  617.  
  618.      If the hook executable can be unloaded successfully, a notification 
  619.       message box is displayed. 
  620.      If the hook executable is not loaded or cannot be unloaded, an error 
  621.       message box is displayed. 
  622.      Both the notification and the error message box can be surpressed by also 
  623.       specifiying the parameter /BATCH. Instead a notification or an error beep 
  624.       is generated. 
  625.  
  626.       In addition the notification and error beeps can be supressed with the 
  627.       parameter /QUIET. 
  628.  
  629.  
  630. ΓòÉΓòÉΓòÉ 6.5.4. /ACTIVATE ΓòÉΓòÉΓòÉ
  631.  
  632. This parameter works exactly like /LOAD. 
  633.  
  634. It is implemented just as a counterpart to /DEACTIVATE. 
  635.  
  636.  
  637. ΓòÉΓòÉΓòÉ 6.5.5. /DEACTIVATE ΓòÉΓòÉΓòÉ
  638.  
  639. In the current version of SendYes! this parameter works exactly like /UNLOAD. 
  640.  
  641. This will change when SendYes! supports deactivating the hook executable 
  642. without unloading it. Then /DEACTIVATE is used for this deactivation. 
  643.  
  644.  
  645. ΓòÉΓòÉΓòÉ 6.5.6. /STATUS ΓòÉΓòÉΓòÉ
  646.  
  647. This parameter queries wether the SendYes! hook executable is active or not. 
  648.  
  649. A status message box is displayed and the following ERRORLEVEL is returned: 
  650.  
  651.  1   SendYes! is active 
  652.  0   SendYes! is not active 
  653.  
  654.  Note: 
  655.  
  656.      When you specify /STATUS, all other parameters but /? are ignored. 
  657.      The status message box can be surpressed by also specifiying the 
  658.       parameter /BATCH. Unlike specifying /BATCH together with other parameters 
  659.       no notification or error beep is generated here. 
  660.  
  661.  
  662. ΓòÉΓòÉΓòÉ 6.5.7. /BATCH ΓòÉΓòÉΓòÉ
  663.  
  664. This parameter surpresses message boxes when processing the parameters /LOAD, 
  665. /UNLOAD, /ACTIVATE, /DEACTIVATE or /STATUS. 
  666.  
  667. Instead of displaying a message box, a notification or an error beep is 
  668. generated. This beep can be surpressed by also specifiying /QUIET. 
  669.  
  670. When using /BATCH together with /STATUS, no notification or error beep is 
  671. generated by default. 
  672.  
  673.  
  674. ΓòÉΓòÉΓòÉ 6.5.8. /QUIET ΓòÉΓòÉΓòÉ
  675.  
  676. This parameter surpresses notification and error beeps when using the parameter 
  677. /BATCH. 
  678.  
  679.  
  680. ΓòÉΓòÉΓòÉ 6.5.9. /? ΓòÉΓòÉΓòÉ
  681.  
  682. This parameter gives a brief help text about the parameters. 
  683.  
  684. When you specify /?, all other parameters are ignored. 
  685.  
  686. Instead of /? also specifying /HELP is valid. 
  687.  
  688.  
  689. ΓòÉΓòÉΓòÉ 7. How can I ... ? ΓòÉΓòÉΓòÉ
  690.  
  691. ... load SendYes! ? 
  692. ... unload SendYes! ? 
  693. ... activate SendYes! ? 
  694. ... deactivate SendYes! ? 
  695. ... query the SendYes! status ? 
  696. ... use SENDYES.EXE in batch files ? 
  697. ... initialize SendYes! ? 
  698.  
  699. ... start the SendYes! GUI ? 
  700. ... select an action profile ? 
  701. ... create action profiles ? 
  702. ... copy an action profile ? 
  703. ... activate action profiles ? 
  704. ... deactivate action profiles ? 
  705. ... edit action profiles ? 
  706. ... test predefined action profiles ? 
  707.  
  708. ... change the language used ? 
  709. ... deinstall SendYes! ? 
  710.  
  711.  
  712. ΓòÉΓòÉΓòÉ 7.1. How can I load SendYes! ? ΓòÉΓòÉΓòÉ
  713.  
  714. To load the SendYes! hook executable 
  715.  
  716.      perform the following steps within the SendYes! GUI: 
  717.  
  718.         1. open the SendYes! GUI 
  719.         2. select the Session Page 
  720.         3. check the checkbox labeled activate SendYes! 
  721.         4. the status field above the pushbuttons displays the new status of 
  722.            SendYes!, if SendYes! was able to load the hook executable. 
  723.  
  724.      or execute the following command on the commandline in the SendYes! 
  725.       directory: 
  726.  
  727.            [start] SENDYES /LOAD [/BATCH] [/QUIET] 
  728.  
  729.  
  730. ΓòÉΓòÉΓòÉ 7.2. How can I unload SendYes! ? ΓòÉΓòÉΓòÉ
  731.  
  732. To unload the SendYes! hook executable 
  733.  
  734.      perform the following steps within the SendYes! GUI: 
  735.  
  736.         1. open the SendYes! GUI 
  737.         2. select the Session Page 
  738.         3. uncheck the checkbox labeled activate SendYes! 
  739.         4. the status field above the pushbuttons displays the new status of 
  740.            SendYes!, if SendYes! was able to unload the hook executable. 
  741.  
  742.      or execute the following command on the commandline in the SendYes! 
  743.       directory: 
  744.  
  745.            [start] SENDYES /UNLOAD [/BATCH] [/QUIET] 
  746.  
  747.  
  748. ΓòÉΓòÉΓòÉ 7.3. How can I activate SendYes! ? ΓòÉΓòÉΓòÉ
  749.  
  750. In the current version of SendYes! activating the SendYes! hook executable is 
  751. in fact the same as loading it. 
  752. To activate the SendYes! hook executable 
  753.  
  754.      perform the following steps within the SendYes! GUI: 
  755.  
  756.         1. open the SendYes! GUI 
  757.         2. select the Session Page 
  758.         3. check the checkbox labeled activate SendYes! 
  759.         4. the status field above the pushbuttons displays the new status of 
  760.            SendYes!, if SendYes! was able to load the hook executable. 
  761.  
  762.      or execute the following command on the commandline in the SendYes! 
  763.       directory: 
  764.  
  765.            [start] SENDYES /ACTIVATE [/BATCH] [/QUIET] 
  766.  
  767.  
  768. ΓòÉΓòÉΓòÉ 7.4. How can I deactivate SendYes! ? ΓòÉΓòÉΓòÉ
  769.  
  770. In the current version of SendYes! deactivating the SendYes! hook executable is 
  771. in fact the same as unloading it. 
  772. To deactivate the SendYes! hook executable 
  773.  
  774.         1. open the SendYes! GUI 
  775.         2. select the Session Page 
  776.         3. uncheck the checkbox labeled activate SendYes! 
  777.         4. the status field above the pushbuttons displays the new status of 
  778.            SendYes!, if SendYes! was able to unload the hook executable. 
  779.  
  780.      or execute the following command on the commandline in the SendYes! 
  781.       directory: 
  782.  
  783.            [start] SENDYES /DEACTIVATE [/BATCH] [/QUIET] 
  784.  
  785.  
  786. ΓòÉΓòÉΓòÉ 7.5. How can I query the SendYes! status ? ΓòÉΓòÉΓòÉ
  787.  
  788. To query the status of the SendYes! hook executable 
  789.  
  790.      perform the following steps within the SendYes! GUI: 
  791.  
  792.         1. open the SendYes! GUI 
  793.         2. select the Session Page 
  794.         3. the status field above the pushbuttons displays the status of 
  795.            SendYes! 
  796.  
  797.      or execute the following command on the commandline in the SendYes! 
  798.       directory: 
  799.  
  800.            [start] SENDYES /STATUS [/BATCH] 
  801.  
  802.  
  803. ΓòÉΓòÉΓòÉ 7.6. How can I use SENDYES.EXE in batch files ? ΓòÉΓòÉΓòÉ
  804.  
  805. To use SENDYES.EXE within batch files, use the parameter /BATCH. This way all 
  806. notification and error message boxes are surpressed. You can always check the 
  807. result via the OS/2 ERRORLEVEL batch variable within normal batch files or the 
  808. variable rc within REXX batch files: Except when querying the status of the 
  809. SendYes! hook executable, the ERRORLEVEL is always zero when SENDYES.EXE was 
  810. executed successfully. Otherwise an OS/2 errorcode is returned. 
  811.  
  812. Note: 
  813.  
  814.      if you use /BATCH for to surpress notification and error message boxes, 
  815.       error and notification beeps are generated instead to give an audio 
  816.       feedback to the user. If you want to surpress those beeps, use /QUIET. 
  817.  
  818.  
  819. ΓòÉΓòÉΓòÉ 7.7. How can I initialize SendYes! ? ΓòÉΓòÉΓòÉ
  820.  
  821. The SendYes! installation program puts a a shadow of Initialize SendYes! into 
  822. the folder Startup, so that SendYes! is initialized on every startup of OS/2. 
  823.  
  824. This only works if the environment variable RESTARTOBJECTS in CONFIG.SYS is set 
  825. to a value that lets the WPS automatically process all objects residing in the 
  826. Startup folder. 
  827.  
  828. The environment variable may be set to the following values within CONFIG.SYS: 
  829.  
  830.  <no value> 
  831.            All programs that were active on shutdown are restartet 
  832.            automatically on system startup. Also all objects that reside in the 
  833.            Startup folder are opened on startup. 
  834.  
  835.            SendYes! can be initialized via the shadow of Initialize SendYes! in 
  836.            the Startup folder. 
  837.  
  838.  STARTUPFOLDERSONLY 
  839.            Programs, that were active on shutdown, are not restartet 
  840.            automatically on startup. All objects that reside in the Startup 
  841.            folder are opened on startup. (BWT, yes, there can be more that one 
  842.            startup folder, although OS/2 creates only one). 
  843.  
  844.            SendYes! can be initialized via the shadow of Initialize SendYes! in 
  845.            the Startup folder. 
  846.  
  847.  NO 
  848.            No programs are started automatically by the WPS. 
  849.  
  850.            SendYes! CANNOT be initialized via the shadow of Initialize SendYes! 
  851.            in the Startup folder. 
  852.  
  853.            Instead put the command the following command into your STARTUP.CMD 
  854.  
  855.                 [start] d:\path\SENDYES /INITIALIZE 
  856.  
  857.            where d:\path is the full qualified pathname of the SendYes! 
  858.            directory, or execute Initialize SendYes! manually. 
  859.  
  860.  
  861. ΓòÉΓòÉΓòÉ 7.8. How can I start the SendYes! GUI ? ΓòÉΓòÉΓòÉ
  862.  
  863. To start the SendYes! GUI, execute the icon 
  864.  
  865.       SendYes! 
  866.  
  867.  or execute the following command on the commandline in the SendYes! directory: 
  868.  
  869.       [start] SENDYES 
  870.  
  871.  
  872. ΓòÉΓòÉΓòÉ 7.9. How can I select an action profile ? ΓòÉΓòÉΓòÉ
  873.  
  874. To select an action profile, perform the following steps: 
  875.  
  876.      open the SendYes! GUI. 
  877.       Refer to 
  878.  
  879.            How can I start the SendYes! GUI ? 
  880.  
  881.      Select the Actions Page. 
  882.  
  883.      To select an action profile with the keyboard, use the TAB key to set the 
  884.       focus onto the list where the profiles is listed. Then use the arrow keys 
  885.       to select the appropriate profile. 
  886.       You can bring up the context menu for that profile by pressing Enter. 
  887.       This applies also if a list is empty. After setting the focus onto a 
  888.       list, pressing Enter also brings up the popup menu. 
  889.  
  890.      To select an action profile with the mouse, click on it. 
  891.       You can bring up the context menu for that profile by clicking with the 
  892.       right mouse button on it. 
  893.       This applies also if a list is empty. Clicking with the right mouse 
  894.       button onto the list also brings up the popup menu. 
  895.  
  896.  
  897. ΓòÉΓòÉΓòÉ 7.10. How can I create action profiles ? ΓòÉΓòÉΓòÉ
  898.  
  899. To create an action profile, perform the following steps on the Actions Page: 
  900.  
  901.      Bring up the context menu of the list Defined action profiles. 
  902.       Refer to 
  903.  
  904.            How can I select an action profile ? 
  905.  
  906.      Select the menu item New... 
  907.  
  908.      SendYes! brings up a dialog where you can fill in the settings for the 
  909.       new profile. 
  910.       Refer to 
  911.  
  912.            action profiles 
  913.            New / Edit / Copy Dialog 
  914.  
  915.  
  916. ΓòÉΓòÉΓòÉ 7.11. How can I copy an action profile ? ΓòÉΓòÉΓòÉ
  917.  
  918. To copy an existing action profile, perform the following steps on the Actions 
  919. Page: 
  920.  
  921.      Select an action profile within the list labeled Defined action profiles. 
  922.       To copy an action profile wich is activated and thus located in the list 
  923.       labeled Active action profiles, deactivate it temporarily so that it is 
  924.       available for a copy operation. 
  925.       Refer to 
  926.  
  927.            How can I select an action profile ? 
  928.            How can I deactivate action profiles ? 
  929.  
  930.      Select the menu item Copy... 
  931.  
  932.      SendYes! brings up a dialog where you can change the settings for the new 
  933.       profile. You must at least change the message text because this must be 
  934.       unique among all action profiles. 
  935.       Refer to 
  936.  
  937.            action profiles 
  938.            New / Edit / Copy Dialog 
  939.  
  940.  
  941. ΓòÉΓòÉΓòÉ 7.12. How can I activate action profiles ? ΓòÉΓòÉΓòÉ
  942.  
  943. To activate an action profile, perform the following steps on the Actions Page: 
  944.  
  945.      If you want to use the keyboard: 
  946.  
  947.         -  Select the action profile you want to activate in the list labeled 
  948.            Defined action profiles and bring up the context menu. 
  949.            Refer to 
  950.                 How can I select an action profile ? 
  951.         -  Select the menu item Activate 
  952.  
  953.       If you want to use the mouse: 
  954.  
  955.         -  Drag the action profile you want to activate from the list labeled 
  956.            Defined action profiles to the list labeled Active action profiles. 
  957.  
  958.  
  959. ΓòÉΓòÉΓòÉ 7.13. How can I deactivate action profiles ? ΓòÉΓòÉΓòÉ
  960.  
  961. To deactivate an action profile, perform the following steps on the Actions 
  962. Page: 
  963.  
  964.      If you want to use the keyboard: 
  965.  
  966.         -  Select the action profile you want to activate in the list labeled 
  967.            Active action profiles and bring up the context menu. 
  968.            Refer to 
  969.                 How can I select an action profile ? 
  970.         -  Select the menu item Deactivate 
  971.  
  972.       If you want to use the mouse: 
  973.  
  974.         -  Drag the action profile you want to activate from the list labeled 
  975.            Active action profiles. to the list labeled Defined action profiles. 
  976.  
  977.  
  978. ΓòÉΓòÉΓòÉ 7.14. How can I edit action profiles ? ΓòÉΓòÉΓòÉ
  979.  
  980. To edit an action profile, perform the following steps on the Actions Page: 
  981.  
  982.      Select the action profile you want to edit and bring up the context menu. 
  983.       The action profile might both be activated or not. 
  984.       Refer to 
  985.  
  986.            How can I select an action profile ? 
  987.  
  988.      Select the menu item Edit... 
  989.  
  990.      SendYes! brings up a dialog where you can change the settings for the 
  991.       profile. 
  992.  
  993.  
  994. ΓòÉΓòÉΓòÉ 7.15. How can I test predefined action profiles ? ΓòÉΓòÉΓòÉ
  995.  
  996. To test predefined action profiles for closing text sessions, SendYes! creates 
  997. the appropriate text sessions automatically for you so that testing the 
  998. profiles is much easier. When the sessions are created, bring up the Window 
  999. List and close them all: 
  1000. The confirmation message boxes should not appear. 
  1001.  
  1002. Of course these profiles work also with every other text session. 
  1003.  
  1004. To let SendYes! create the text sessions for you, perform the following steps 
  1005. on the Actions Page: 
  1006.  
  1007.      If not yet done, activate one or better both predefined action profiles 
  1008.       for closing text sessions. They are labeled 
  1009.  
  1010.         -  OS/2 win close and 
  1011.         -  OS/2 fs close. 
  1012.  
  1013.       Refer to 
  1014.  
  1015.            How can I activate action profiles ? 
  1016.  
  1017.      Select one of these action profiles (only when activated) and bring up 
  1018.       the context menu. 
  1019.       Refer to 
  1020.  
  1021.            How can I select an action profile ? 
  1022.  
  1023.      Select the menu item Test... 
  1024.  
  1025.  
  1026. ΓòÉΓòÉΓòÉ 7.16. How can I change the language used ? ΓòÉΓòÉΓòÉ
  1027.  
  1028. To change the language used by SendYes!, simply run the installation program 
  1029. again by executing the icon SendYes! WPS installation program or run the 
  1030. program from the commandline. 
  1031.  
  1032. In the installation program 
  1033.  
  1034.    1. select the new language to use and 
  1035.    2. reinstall the SendYes! WPS program objects 
  1036.  
  1037.  That will also change the language used by the SendYes! GUI. 
  1038.  
  1039.  Note: 
  1040.  
  1041.      The new selection of language becomes permanent only if you reinstall the 
  1042.       SendYes! WPS program objects. If you exit the installation program before 
  1043.       doing that, a change of language is ignored. 
  1044.  
  1045.  
  1046. ΓòÉΓòÉΓòÉ 7.17. How can I deinstall SendYes! ? ΓòÉΓòÉΓòÉ
  1047.  
  1048. To deinstall SendYes!, execute run the deinstallation program by executing the 
  1049. icon SendYes! WPS deinstallation program or run the deinstallation program from 
  1050. the commandline. 
  1051.  
  1052. This will remove the SendYes! WPS program objects from your desktop. Then 
  1053. delete the files of the SendYes! package. 
  1054.  
  1055.  
  1056. ΓòÉΓòÉΓòÉ 8. Limitations ΓòÉΓòÉΓòÉ
  1057.  
  1058.      SendYes! normally is able to process only standard message boxes created 
  1059.       with the WinMessageBox API. The IDs for the pushbuttons used within these 
  1060.       standard message box are defined by the programmers toolkit. 
  1061.  
  1062.       The second API WinMessageBox2 gives the programmer also the ability to 
  1063.       bring up a message box, but to use pushbuttons with self defined 
  1064.       pushbutton texts and pushbutton IDs. SendYes! will only be able to 
  1065.       process these message boxes if at least the standard pushbutton IDs are 
  1066.       used, because it cannot know other IDs than these. 
  1067.       More it will help you a lot if also the pushbutton texts apply somehow to 
  1068.       the standard pushbutton texts, otherwise you will have difficulties to 
  1069.       figure out which button text you have to select within the SendYes! 
  1070.       action profile. 
  1071.       An example where all might work ok is, if an application shall bring up 
  1072.       all message boxes with pushbuttons labeled in one specific language no 
  1073.       matter what language specific OS/2 it is running under. Then the 
  1074.       programmer of that application could use the WinMessageBox2 API and 
  1075.       define the pushbuttons to use within the message box with the standard 
  1076.       pushbutton IDs and button texts. That way a SendYes! action profile could 
  1077.       be set up for this message box as usual. 
  1078.  
  1079.       If you are not sure wether a message box is using the default pushbutton 
  1080.       IDs, use the utility PM Tree and check the pushbutton IDs: they should be 
  1081.       in the range from 1 to 8. 
  1082.  
  1083.       Note: 
  1084.  
  1085.         -  PM Tree displays ID 1 as DID_OK and ID 2 as DID_CANCEL 
  1086.         -  If the message box that you examine uses less than four pushbuttons, 
  1087.            there will also be one or more unused buttons with IDs from 0x65 to 
  1088.            0x67, because always four buttons are created and only the IDs of 
  1089.            pushbuttons that are visible and used are redefined. 
  1090.  
  1091.  
  1092. ΓòÉΓòÉΓòÉ 9. Things to come ΓòÉΓòÉΓòÉ
  1093.  
  1094.      In a forthcoming version SENDYES.EXE will be replaced by a real WPS 
  1095.       object and the actual notebook pages will be added to the WPS object 
  1096.       settings notbook. All the commandline parameters will be replaced by 
  1097.       setup strings, so that a batch interface is still possible. For those who 
  1098.       still want to play around with the commandline and not use WPS objects, I 
  1099.       think of providing a REXX Batch supporting the SENDYES.EXE commandline 
  1100.       parms of V2.00. 
  1101.  
  1102.      In future versions the hook will be loadable by the PMSHELL process so 
  1103.       that the overhead of an extra process is eliminated. The memory used by 
  1104.       SendYes! will not decrease though, the only difference will be that the 
  1105.       hook loader will also reside in a DLL which is loaded automatically by 
  1106.       PMSHELL. The drawback is that to get SendYes! out of memory a reboot is 
  1107.       needed. This is why loading by a separate process will stay available, 
  1108.       the user then will be able to choose wether the SendYes! hook executable 
  1109.       should be loaded by PMSHELL or by a separate process. 
  1110.       Note that the checkbox activate SendYes! on the Actions Page is disabled 
  1111.       because in the current version of SendYes! the hook executable is always 
  1112.       loaded by a separate process. 
  1113.  
  1114.      In the current version of SendYes! the hook executable is always unloaded 
  1115.       when it is deactivated. In future versions it will be also possible to 
  1116.       deactivate it but to leave it in memory. This will be the only option 
  1117.       available for loading the SendYes! hook executable by PMSHELL, but when 
  1118.       loading it by a separate process the user can define wether it should be 
  1119.       unloaded when deactvating it. 
  1120.       Note that the checkbox unload on deactivate on the Actions Page is 
  1121.       disabled because in the current version of SendYes! the hook executable 
  1122.       is always unloaded on deactivation. 
  1123.  
  1124.      SendYes! will be enhanced by a kind of snapshot function or learning mode 
  1125.       where it collects all messages being popped up while the learning mode is 
  1126.       active. This will relief the user from (mis)-typing message texts when 
  1127.       creating new action profiles. 
  1128.       Note that the menuitem Sniffer... in the context popup menu of the list 
  1129.       labeled Defined action profiles on the Actions Page is disabled in the 
  1130.       current version of SendYes! and reserved for future implementation of 
  1131.       that functionality. 
  1132.  
  1133.      In the current version of SendYes! the message text must be entered just 
  1134.       as it appears in the message box that is to be processed. It might make 
  1135.       sense to allow regular expressions instead, but then I have also to be 
  1136.       able to compare regular expressions with each other, since message texts 
  1137.       and so the regular expressions stored in them have to be unique among all 
  1138.       stored profiles. Right now a simple case sensitive string compare is used 
  1139.       to ensure that a new or changed message text is unique ... 
  1140.  
  1141.       On the other hand if the Sniffer... is implemented regular expressions 
  1142.       might not be needed. 
  1143.  
  1144.      An export and import functionality for action profiles might be nice. 
  1145.       Right now I'm not shure if that is really needed. Please comment on that 
  1146.       via email if you think that is useful. 
  1147.  
  1148.      The lists on the Actions Page are only single select lists. It would be 
  1149.       nice to be able to select more than one action profile at a time and to 
  1150.       move them around together. This sounds easy but is really complicated and 
  1151.       a lot of work to do under the covers... 
  1152.  
  1153.  
  1154. ΓòÉΓòÉΓòÉ 10. Technical details ΓòÉΓòÉΓòÉ
  1155.  
  1156. The SendYes! PM hooks 
  1157. enhanced listbox controls 
  1158. national language support 
  1159. IPFC Preprocessor 
  1160. syslevel manager 
  1161.  
  1162.  
  1163. ΓòÉΓòÉΓòÉ 10.1. The SendYes! PM hooks ΓòÉΓòÉΓòÉ
  1164.  
  1165. PM Hooks in general 
  1166. There are different categories of hooks and the system sends every message to 
  1167. the hook of the appropriate category. After the installation of the hook all 
  1168. messages are send first of all to that hook. The hook normally reacts only on 
  1169. certain messages, while the most of them are passed through to the receiver of 
  1170. the message werden. 
  1171. The two most important hooks are the SendMessage hook and the Inoput hook. The 
  1172. first receives all messages, which are sent synchronously to a PM window with 
  1173. the API WinSendMsg. The SendMessage hook must pass the message to the receiver, 
  1174. but before doing that he can perform any necessary action. 
  1175. The Input hook receives all messages, that are posted asynchronously to a PM 
  1176. window with tha API WinPostMsg and are put into the message queue of that 
  1177. window until the message can be processed. The Input hook can not only react on 
  1178. the message, but can also prevent the message from being put into the receivers 
  1179. message queue. That way the receiver will never get this message. 
  1180.  
  1181. The SendYes! PM hooks 
  1182. SendYes! installs both a SendMessage hook and an Input hook. The SendYes! 
  1183. SendMessage hook waits for a focus change message. 
  1184. These messages are sent from the PM to every dialog window, which subcontrol 
  1185. receives or losses the input focus. SendYes! can determine wether the dialog is 
  1186. a message box. If this is the case, the message text of the message box is 
  1187. compared to the active action profiles. Is the message text of the message box 
  1188. equal to the message text of an active action profile, the action defined in 
  1189. the action profile is performed indirectly. 
  1190.  
  1191. The action cannot be performed directly, because on the first reception of a 
  1192. focus change message a message box is not yet completely initialized. Only the 
  1193. default pushbutton is initialized and available for an action at this time, all 
  1194. others are not. 
  1195.  
  1196. In order to be able to perform actions on all pushbuttons, SendYes! must make 
  1197. sure that it receives control again at a later point of time. It uses 
  1198. WinPostMsg to post a special message to the message box. Since every PM window 
  1199. cannot receive messages stored in it's message queue until the initialization 
  1200. of the window is finished, the message box receives this special message when 
  1201. it is completely initialized. 
  1202. At this time the SendYes! Input hook catches this message and can perform the 
  1203. desired action on all of the pushbuttons, which are now available. 
  1204.  
  1205. A special case is, when the desired action is to set a pushbutton as the 
  1206. default pushbutton (and this setting the focus on it): then SendYes! must 
  1207. ensure that this action is performed only once, when the message box is 
  1208. activated for the first time and one of its subcontrols is receiving the focus. 
  1209. Otherwise each focus change within the message box, so for example moving the 
  1210. input focus with the arrow keys, would cause the same action again and the 
  1211. focus would be set back again to the same pushbutton by SendYes!. The result 
  1212. would be that the focus within the message box could not be changed via the 
  1213. keyboard and with the keyboard only that one pushbutton could be reached. 
  1214.  
  1215. Technical details about PM hooks 
  1216. A PM hook is a function which has to reside in a DLL. The process which sets up 
  1217. the hook has to reside in memory until the hook is released again. 
  1218. So as a minimum for setting up a hook an executable and a DLL is needed. In 
  1219. order to minimze the amount of memory that is used by the hook since V2.00 of 
  1220. SendYes! the executable that is loading the hook is separated from SENDYES.EXE. 
  1221. This way it was possible to enhance the user interface within SENDYES.EXE a lot 
  1222. while the the hook still needs only the same amount of memory like before. 
  1223. Since SENDYES.EXE is needed only for configuration or initialization, the only 
  1224. memory needed when SendYes! runs in the background is the little amount of 
  1225. memory that is used by the hook. 
  1226.  
  1227. The two following modules for the hook loader and the hook DLL do the most of 
  1228. the work and so are the most interesting (and though the smallest) of all 
  1229. SendYes! source files: 
  1230.  
  1231.      hook loader executable 
  1232.      hook dll 
  1233.  
  1234.  See also the programmers toolkit documentation for further information on 
  1235.  sending and posting PM messages and the PM hooks. 
  1236.  
  1237.  
  1238. ΓòÉΓòÉΓòÉ 10.1.1. hook loader ΓòÉΓòÉΓòÉ
  1239.  
  1240. SNDYSHK.C 
  1241.  
  1242. #define INCL_DOSSEMAPHORES
  1243. #define INCL_DOSMODULEMGR
  1244. #define INCL_WINWINDOWMGR
  1245. #define INCL_WINMESSAGEMGR
  1246. #define INCL_WINHOOKS
  1247. #define INCL_ERRORS
  1248.  
  1249. #define INCL_DOSPROCESS
  1250.  
  1251. #include <os2.h>
  1252. #include <stdlib.h>
  1253. #include <string.h>
  1254. #include "sndyshk.h"
  1255. #include "sndysdll.h"
  1256. #include "sndysldr.h"
  1257.  
  1258. #define SENDYES_HOOKDLLFILE      "SNDYSDLL"
  1259.  
  1260. #define ERROR_BEEP      DosBeep(800,100)
  1261.  
  1262. /*ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1263.  *Γöé Name      : main                                                       Γöé
  1264.  *Γöé Comment   :                                                            Γöé
  1265.  *Γöé Author    : C.Langanke                                                 Γöé
  1266.  *Γöé Date      : 05.11.1995                                                 Γöé
  1267.  *Γöé Update    : 05.11.1995                                                 Γöé
  1268.  *Γöé called by : C-Runtime                                                  Γöé
  1269.  *Γöé calls     : Win*, Dos*                                                 Γöé
  1270.  *Γöé Input     : INT, PSZ[]  - command line parms                           Γöé
  1271.  *Γöé Tasks     : - starts hook                                              Γöé
  1272.  *Γöé returns   : INT - OS/2 error code                                      Γöé
  1273.  *ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1274.  */
  1275. INT main
  1276.          (
  1277.          INT            argc,
  1278.          PSZ            argv[]
  1279.          )
  1280. {
  1281.          HAB            hab;
  1282.          HMQ            hmq;
  1283.          QMSG           qmsq;
  1284.          HEV            hevTerminationSem  = 0;
  1285.          HEV            hevStartupSem      = 0;
  1286.          HLIB           hlibDLL            = 0;
  1287.          BOOL           fSendMsgHookActive = FALSE;
  1288.          BOOL           fInputHookActive   = FALSE;
  1289.          APIRET         rc                 = NO_ERROR;
  1290.  
  1291. do
  1292.    {
  1293.    // check if startup sem is there to make sure that
  1294.    // this executable is loaded only by the SendYes! GUI
  1295.    rc = DosOpenEventSem( SEM_STARTUP,
  1296.                          &hevStartupSem);
  1297.    if (rc != NO_ERROR)
  1298.       break;
  1299.  
  1300.    // initialize PM resources
  1301.    hab = WinInitialize( 0);
  1302.    if (hab == NULLHANDLE)
  1303.       {
  1304.       rc = ERROR_INVALID_FUNCTION;
  1305.       break;
  1306.       }
  1307.  
  1308.    hmq = WinCreateMsgQueue( hab, 0);
  1309.    if (hmq == NULLHANDLE)
  1310.       {
  1311.       rc = ERRORIDERROR( WinGetLastError( hab));
  1312.       break;
  1313.       }
  1314.  
  1315.    // do not participate on shutdown processing
  1316.    // because we will not dispatch our message queue,
  1317.    if (!WinCancelShutdown( hmq, TRUE))
  1318.       {
  1319.       rc = ERRORIDERROR( WinGetLastError( hab));
  1320.       break;
  1321.       }
  1322.  
  1323.    // initialize SENDYES DLL Data
  1324.    rc = InitDllData();
  1325.    if (rc != NO_ERROR)
  1326.       {
  1327.       break;
  1328.       }
  1329.  
  1330.    // set up termination sem
  1331.    rc = DosCreateEventSem( SEM_TERMINATION,     // name of sem
  1332.                            &hevTerminationSem,  // handle
  1333.                            0L,                  // named sem always shared
  1334.                            FALSE);              // initially set
  1335.    if (rc != NO_ERROR)
  1336.       {
  1337.       break;
  1338.       }
  1339.  
  1340.    // get DLL Handle, cannot fail because it is linked already statically
  1341.    rc = DosQueryModuleHandle( SENDYES_HOOKDLLFILE, &hlibDLL);
  1342.  
  1343.    // start the SendMsg hook
  1344.    fSendMsgHookActive = WinSetHook( hab, NULLHANDLE, HK_SENDMSG, (PFN)&SendMsgHook, hlibDLL);
  1345.    fInputHookActive   = WinSetHook( hab, NULLHANDLE, HK_INPUT,   (PFN)&InputHook,   hlibDLL);
  1346.    if ((!fSendMsgHookActive) || (!fInputHookActive))
  1347.       {
  1348.       rc = ERRORIDERROR( WinGetLastError( hab));
  1349.       break;
  1350.       }
  1351.  
  1352.    // note that the message queue is not dispatched,
  1353.    // as in normal PM programs. We need the message
  1354.    // queue only for being able to call Win* APIs
  1355.    // the hooks do not make use of it ...
  1356.  
  1357.    // now post startup sem for the SendYes! GUI
  1358.    // to signal that startup processing has finished
  1359.    DosPostEventSem( hevStartupSem);
  1360.  
  1361.    // ... and wait for termination sem
  1362.    // posted by the SendYes! GUI
  1363.    rc = DosWaitEventSem( hevTerminationSem, SEM_INDEFINITE_WAIT);
  1364.  
  1365.    } while (FALSE);
  1366.  
  1367. // cleanup
  1368. DeinitDllData();
  1369.  
  1370. if (fSendMsgHookActive) WinReleaseHook( hab, NULLHANDLE, HK_SENDMSG, (PFN)&SendMsgHook, (HLIB)0);
  1371. if (fInputHookActive)   WinReleaseHook( hab, NULLHANDLE, HK_SENDMSG, (PFN)&InputHook,   (HLIB)0);
  1372. if (hmq)                WinDestroyMsgQueue( hmq);
  1373. if (hab)                WinTerminate( hab);
  1374. if (hevTerminationSem)  DosCloseEventSem (hevTerminationSem);
  1375. if (hevStartupSem)      DosCloseEventSem( hevStartupSem);
  1376. if (rc != NO_ERROR)     ERROR_BEEP;
  1377.  
  1378. return rc;
  1379. }
  1380.  
  1381.  
  1382. ΓòÉΓòÉΓòÉ 10.1.2. hook ΓòÉΓòÉΓòÉ
  1383.  
  1384. SNDYSDLL.H 
  1385.  
  1386.  
  1387. #ifndef _SNDYSDLL_H
  1388. #define _SNDYSDLL_H
  1389.  
  1390. #include <os2.h>
  1391.  
  1392. //
  1393. //      public prototypes
  1394. //
  1395.  
  1396. VOID EXPENTRY SendMsgHook( HAB hab, PSMHSTRUCT psmh, BOOL fInterTask);
  1397. BOOL EXPENTRY InputHook( HAB hab, PQMSG pqmsg, USHORT usRemove);
  1398.  
  1399. APIRET InitDllData( VOID);
  1400. APIRET DeinitDllData( VOID);
  1401.  
  1402. #endif // _SNDYSDLL_H
  1403.  
  1404. SNDYSDLL.C 
  1405.  
  1406. #define INCL_WIN
  1407. #define INCL_DOS
  1408. #define INCL_ERRORS
  1409.  
  1410. #include <os2.h>
  1411. #include "sndysdll.h"
  1412. #include "sndysprf.h"
  1413. #include "sndyshk.h"
  1414.  
  1415. #include <string.h>
  1416.  
  1417. //
  1418. //      magic values for resids
  1419. //      when these ids change, SendYes! will not work anylonger ...
  1420. //
  1421.  
  1422. #define ID_MSGBOX_MESSAGE   200                    // ID of message text
  1423. #define ID_MSGBOX_ICON      300                    // ID of icon
  1424.  
  1425. //
  1426. //      global variables
  1427. //
  1428.  
  1429. static   BOOL           fInitialized         = FALSE;
  1430. static   PACTIONPRFLIST pactionprflistGlobal = NULL;
  1431. static   HMTX           hmtxUpdateGlobal     = 0L;
  1432.  
  1433. //
  1434. //      defines for trigger message
  1435. //
  1436.  
  1437. #define WM_USER_MSGBOX_TRIGGER   0xFEDC
  1438. #define MP_USER_MSGBOX_TRIGGER   0xFEDC
  1439.  
  1440. /*ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1441.  *Γöé Name      : InitDllData                                                Γöé
  1442.  *Γöé Comment   : is to be called before use of the hook.                    Γöé
  1443.  *Γöé Author    : C.Langanke                                                 Γöé
  1444.  *Γöé Date      : 10.10.1995                                                 Γöé
  1445.  *Γöé Update    : 18.12.1995                                                 Γöé
  1446.  *Γöé called by : main                                                       Γöé
  1447.  *Γöé calls     : Dos*                                                       Γöé
  1448.  *Γöé Global i/o: PACTIONPRFLIST - pointer to list in named shared segment   Γöé
  1449.  *Γöé             HMTX           - handle to update semaphore                Γöé
  1450.  *Γöé             BOOL           - initialize flag                           Γöé
  1451.  *Γöé Input     : -                                                          Γöé
  1452.  *Γöé Tasks     : - initialises DLL data:                                    Γöé
  1453.  *Γöé               - gets access to shared segment                          Γöé
  1454.  *Γöé               - creates update semaphore                               Γöé
  1455.  *Γöé returns   : APIRET - OS/2 error code                                   Γöé
  1456.  *ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1457.  */
  1458. APIRET _Export InitDllData ( VOID)
  1459. {
  1460.          APIRET        rc;
  1461.  
  1462. // initialized ?
  1463. if (fInitialized)
  1464.    return NO_ERROR;
  1465.  
  1466. do
  1467.    {
  1468.    // get access to named shared segment
  1469.    // to keep it in access for this process
  1470.    rc =  DosGetNamedSharedMem( (PVOID *) &pactionprflistGlobal,
  1471.                                SEG_ACTIONPRFLIST,
  1472.                                PAG_READ | PAG_WRITE);
  1473.    if (rc != NO_ERROR)
  1474.       break;
  1475.  
  1476.    // set up uptdate sem to keep it
  1477.    // in access for this process
  1478.    rc = DosCreateMutexSem( SEM_UPDATE,          // name of sem
  1479.                            &hmtxUpdateGlobal,   // handle
  1480.                            0L,                  // named sem always shared
  1481.                            FALSE);              // initially not owned
  1482.    if (rc != NO_ERROR)
  1483.       break;
  1484.  
  1485.    } while (FALSE);
  1486.  
  1487.  
  1488. // initialize done
  1489. fInitialized = (rc == NO_ERROR);
  1490.  
  1491. return rc;
  1492. }
  1493.  
  1494. /*ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1495.  *Γöé Name      : DeinitDllData                                              Γöé
  1496.  *Γöé Comment   : is to be called on termination of hook                     Γöé
  1497.  *Γöé Author    : C.Langanke                                                 Γöé
  1498.  *Γöé Date      : 10.10.1995                                                 Γöé
  1499.  *Γöé Update    : 18.12.1995                                                 Γöé
  1500.  *Γöé called by : main                                                       Γöé
  1501.  *Γöé calls     : Dos*                                                       Γöé
  1502.  *Γöé Global i/o: PACTIONPRFLIST - pointer to list in named shared segment   Γöé
  1503.  *Γöé             HMTX           - handle to update semaphore                Γöé
  1504.  *Γöé             BOOL           - initialize flag                           Γöé
  1505.  *Γöé Input     : -                                                          Γöé
  1506.  *Γöé Tasks     : - free DLL resources                                       Γöé
  1507.  *Γöé returns   : APIRET - OS/2 error code                                   Γöé
  1508.  *ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1509.  */
  1510. APIRET _Export DeinitDllData ( VOID)
  1511. {
  1512.  
  1513. // deaktivate hook
  1514. fInitialized = FALSE;
  1515.  
  1516. // free named shared segment
  1517. DosFreeMem( pactionprflistGlobal);
  1518.  
  1519. // close update sem
  1520. DosCloseMutexSem( hmtxUpdateGlobal);
  1521.  
  1522. return NO_ERROR;
  1523.  
  1524. }
  1525.  
  1526. /*ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1527.  *Γöé Name      : SendMsgHook                                                Γöé
  1528.  *Γöé Comment   : Original version by Wes Santee, 1995                       Γöé
  1529.  *Γöé             Note that the global variables (pointer to shared mem      Γöé
  1530.  *Γöé             and handle to update sem) are not valid within the hook    Γöé
  1531.  *Γöé             function, because this function is executed within the     Γöé
  1532.  *Γöé             process environment of the message sender.                 Γöé
  1533.  *Γöé             So they must be obtained from the system again.            Γöé
  1534.  *Γöé             Note that not all pushbuttons are defined, when            Γöé
  1535.  *Γöé             WM_FOCUSCHANGE or WM_ACTIVATE is sent (only the buttons    Γöé
  1536.  *Γöé             up to the defpushbutton are already there). Because we     Γöé
  1537.  *Γöé             want to be able to act on all pushbuttons, we post a       Γöé
  1538.  *Γöé             a trigger message and intercept that later through the     Γöé
  1539.  *Γöé             input hook, because that one is processed after creation   Γöé
  1540.  *Γöé             of the message box.                                        Γöé
  1541.  *Γöé Author    : Wes Santee, C.Langanke                                     Γöé
  1542.  *Γöé Date      : 1995                                                       Γöé
  1543.  *Γöé Update    : 18.12.1995                                                 Γöé
  1544.  *Γöé called by : WinSendMsg API (???)                                       Γöé
  1545.  *Γöé calls     : Win*, Dos*                                                 Γöé
  1546.  *Γöé Input     : HAB, PSMHSTRUCT, BOOL - parms of Send Message Hook         Γöé
  1547.  *Γöé Tasks     : - intercepts focuschange messages                          Γöé
  1548.  *Γöé               - if it is a msgbox to process, post trigger message     Γöé
  1549.  *Γöé returns   : VOID                                                       Γöé
  1550.  *ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1551.  */
  1552. VOID _Export EXPENTRY SendMsgHook
  1553.          (
  1554.          HAB            hab,
  1555.          PSMHSTRUCT     psmh,
  1556.          BOOL           fInterTask
  1557.          )
  1558. {
  1559.  
  1560. // initialized ?
  1561. if (!fInitialized)
  1562.    return;
  1563.  
  1564. // is it a focuschange and a "gain focus" message ?
  1565. if ((psmh->msg == WM_FOCUSCHANGE) && ( SHORT1FROMMP( psmh->mp2) == TRUE))
  1566.    {
  1567.             ULONG          ulWindowID;
  1568.             CHAR           szClassName[ 32];
  1569.             HWND           hwndMessage;
  1570.             HWND           hwndIcon;
  1571.  
  1572.    // focus change in effect, is it a frame window ?
  1573.    WinQueryClassName( psmh->hwnd, sizeof( szClassName), szClassName);
  1574.    if ( strcmp( szClassName, "#1") == 0)
  1575.       {
  1576.  
  1577.       // has it subcontrols with the magic res
  1578.       // id for message text and icons ?
  1579.       hwndIcon = WinWindowFromID( psmh->hwnd, ID_MSGBOX_ICON);
  1580.       hwndMessage = WinWindowFromID( psmh->hwnd, ID_MSGBOX_MESSAGE);
  1581.  
  1582.       if ((hwndIcon) && (hwndMessage))
  1583.          {
  1584.                    APIRET         rc;
  1585.                    CHAR           szDialogMessage[ MESSAGE_MAXLEN];
  1586.                    ULONG          i;
  1587.                    PACTIONPRFLIST pactionprflist = NULL;
  1588.                    PACTIONPRF     pactionprf     = NULL;
  1589.                    HMTX           hmtxUpdate     = 0;
  1590.          do
  1591.             {
  1592.  
  1593.             // query message text
  1594.             if (!WinQueryWindowText( hwndMessage,
  1595.                                      sizeof( szDialogMessage),
  1596.                                      szDialogMessage))
  1597.                break;
  1598.  
  1599.             // get access to named shared segment
  1600.             // for the callers process environment
  1601.             rc =  DosGetNamedSharedMem( (PVOID *) &pactionprflist,
  1602.                                         SEG_ACTIONPRFLIST,
  1603.                                         PAG_READ | PAG_WRITE);
  1604.             if (rc != NO_ERROR)
  1605.                break;
  1606.  
  1607.             // get handle to update sem
  1608.             // for the callers process environment
  1609.             rc = DosOpenMutexSem( SEM_UPDATE,
  1610.                                   &hmtxUpdate);
  1611.             if (rc != NO_ERROR)
  1612.                break;
  1613.  
  1614.             // get exclusive access to action profile list
  1615.             rc = DosRequestMutexSem( hmtxUpdate,
  1616.                                      SHAREDACCESS_WAIT);
  1617.             if (rc != NO_ERROR)
  1618.                break;
  1619.  
  1620.             // loop through all profiles
  1621.             for (i = 0, pactionprf = &pactionprflist->actionprf;
  1622.                  i < pactionprflist->ulActionCount;
  1623.                  i++, pactionprf = NEXTACTIONPRF( pactionprf))
  1624.                {
  1625.  
  1626.                // skip profiles marked inactive or deleted
  1627.                if ((!pactionprf->fActive) || (pactionprf->fDeleted))
  1628.                   continue;
  1629.  
  1630.                // is it the message stored in this action profile ?
  1631.                if (strcmp( szDialogMessage,
  1632.                            pactionprf->szMessage) != 0)
  1633.                   continue;
  1634.                else
  1635.                   {
  1636.  
  1637.                   // post trigger message with button and action
  1638.                   WinPostMsg( psmh->hwnd, WM_USER_MSGBOX_TRIGGER,
  1639.                               MPFROMSHORT(MP_USER_MSGBOX_TRIGGER),
  1640.                               MPFROM2SHORT( pactionprf->ulButton, pactionprf->ulAction));
  1641.  
  1642.                   // message found, so we're done
  1643.                   break;
  1644.  
  1645.                   } // end if "stored message"
  1646.  
  1647.                } // end for "all messages"
  1648.  
  1649.  
  1650.             } while (FALSE);
  1651.  
  1652.          // release access to the shared segment
  1653.          if (hmtxUpdate)
  1654.             {
  1655.             DosReleaseMutexSem( hmtxUpdate);
  1656.             DosCloseMutexSem( hmtxUpdate);
  1657.             }
  1658.  
  1659.          // free shared segment
  1660.          DosFreeMem( pactionprflist);
  1661.  
  1662.          } // end if (hwndMessage)
  1663.  
  1664.       } // if (hwndDesktop == hwndParent)
  1665.  
  1666.    } // end if (psmh->msg == WM_FOCUSCHANGE )
  1667.  
  1668. return;
  1669. }
  1670.  
  1671. /*ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1672.  *Γöé Name      : InputHook                                                  Γöé
  1673.  *Γöé Comment   :                                                            Γöé
  1674.  *Γöé Author    : C.Langanke                                                 Γöé
  1675.  *Γöé Date      : 06.12.1995                                                 Γöé
  1676.  *Γöé Update    : 06.12.1995                                                 Γöé
  1677.  *Γöé called by : PM message queue                                           Γöé
  1678.  *Γöé calls     : Win*, Dos*                                                 Γöé
  1679.  *Γöé Input     : HAB, PQMSG, USHORT - parms of input hook                   Γöé
  1680.  *Γöé Tasks     : - intercepts trigger message and performs specified action Γöé
  1681.  *Γöé               on specified pushbutton.                                 Γöé
  1682.  *Γöé returns   : BOOL - remove flag                                         Γöé
  1683.  *ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1684.  */
  1685. BOOL EXPENTRY InputHook
  1686.          (
  1687.          HAB            hab,
  1688.          PQMSG          pqmsg,
  1689.          USHORT         usRemove
  1690.          )
  1691. {
  1692.          BOOL           fRemove = FALSE;
  1693. static   HWND           hwndFocusChanged = NULLHANDLE;
  1694.  
  1695. // make sure that it is really our trigger message !
  1696. if ((pqmsg->msg == WM_USER_MSGBOX_TRIGGER) &&
  1697.     (pqmsg->mp1 == (MPFROMSHORT(MP_USER_MSGBOX_TRIGGER))))
  1698.    {
  1699.  
  1700.              HWND           hwndButton;
  1701.              ULONG          ulButton = SHORT1FROMMP( pqmsg->mp2);
  1702.              ULONG          ulAction = SHORT2FROMMP( pqmsg->mp2);
  1703.  
  1704.    // determine button window
  1705.    hwndButton = WinWindowFromID( pqmsg->hwnd, ulButton);
  1706.  
  1707.    // act upon button only if it is there
  1708.    if (hwndButton != NULLHANDLE)
  1709.       {
  1710.  
  1711.       switch (ulAction)
  1712.          {
  1713.          case ACTION_PRESS:
  1714.             WinPostMsg( hwndButton, BM_CLICK, MPFROMLONG( FALSE), 0);
  1715.             break;
  1716.  
  1717.          case ACTION_DEFAULT:
  1718.             // make sure to change focus only once per message box
  1719.             if (pqmsg->hwnd != hwndFocusChanged)
  1720.                {
  1721.                WinSetFocus( WinQueryDesktopWindow( WinQueryAnchorBlock( pqmsg->hwnd), 0), hwndButton);
  1722.                WinPostMsg( hwndButton, BM_SETDEFAULT, MPFROMLONG( TRUE), 0);
  1723.                hwndFocusChanged = pqmsg->hwnd;
  1724.                }
  1725.             break;
  1726.  
  1727.          case ACTION_DISABLE:
  1728.             WinEnableWindow(  hwndButton, FALSE);
  1729.             break;
  1730.  
  1731.          } // end switch
  1732.  
  1733.       } // end if (hwndButton != NULLHANDLE)
  1734.  
  1735.    // remove message
  1736.    fRemove = TRUE;
  1737.  
  1738.    } // end if ((pqmsg->msg == WM_USER_MSGBOX_TRIGGER) && ...
  1739.  
  1740. return fRemove;
  1741. }
  1742.  
  1743.  
  1744. ΓòÉΓòÉΓòÉ 10.2. enhanced listbox controls ΓòÉΓòÉΓòÉ
  1745.  
  1746. In order to provide a user fiendly interface SendYes!  takes advantage of the 
  1747. easy to program and easy to use Direct Manipulation ListBox (DMLB) control and 
  1748. the MultiColumn ListBox (MCLB) PM control functionality. 
  1749.  
  1750. This enhanced functionality allows to have a multi column listbox and to 
  1751. support drag and drop within and between listboxes. This way it provides some 
  1752. of the container functionality, but is much easier to program and faster when 
  1753. using it. SendYes! uses a slightly modified version of the Direct Manipulation 
  1754. ListBox (DMLB) control. 
  1755.  
  1756. Look out for LB.ZIP on IBM ftp sites, which contains the complete source code 
  1757. and INF reference files. 
  1758.  
  1759. For more information on programming with these controls control, see OS/2 
  1760. Developer Magazine, Nov/Dec 1995. 
  1761.  
  1762.  
  1763. ΓòÉΓòÉΓòÉ 10.2.1. Direct Manipulation ListBox (DMLB) ΓòÉΓòÉΓòÉ
  1764.  
  1765. Excerpt from DMLB.INF: 
  1766.  
  1767. Acknowledgments 
  1768. This control was originally conceived at IBM Yorktown Research by Alan Warren. 
  1769. The control was rewritten and enhanced by Mark McMillan of IBM, Research 
  1770. Triangle Park, USA. 
  1771.  
  1772. Description 
  1773. The Direct Manipulation ListBox is a very useful enhancement for the standard 
  1774. PM listbox control.  It supplies the capability to support drag/drop reordering 
  1775. of items in a listbox, and drag/drop of items from one listbox to another. 
  1776.  
  1777.  
  1778. ΓòÉΓòÉΓòÉ 10.2.2. MultiColumn ListBox (MCLB) ΓòÉΓòÉΓòÉ
  1779.  
  1780. Excerpt from MCLB.INF: 
  1781.  
  1782. Acknowledgments 
  1783. This control was originally conceived at the IBM United Kingdom Warwick 
  1784. Development group by Charles Cooper.  The control was rewritten and enhanced by 
  1785. Mark McMillan of IBM, Research Triangle Park, USA. 
  1786.  
  1787. Description 
  1788. The MultiColumn ListBox is a very useful PM custom control designed to overcome 
  1789. some of the limitations of the standard PM listbox and container controls.  It 
  1790. is simpler and in many cases faster than a container, but provides multicolumn 
  1791. (tabular) support for display of column-oriented data. 
  1792.  
  1793. The MCLB supports individually sizable columns, optional horizontal scroll bars 
  1794. at the base of each column, seperate font and color support for the titles and 
  1795. column data, owner-drawn lists, and a simple listbox-style programming model. 
  1796.  
  1797. The MCLB can be subclassed with the DMLB (Direct Manipulation ListBox) function 
  1798. also supplied in this toolkit to provide drag/drop reordering capability to the 
  1799. MCLB. 
  1800.  
  1801.  
  1802. ΓòÉΓòÉΓòÉ 10.3. national language support ΓòÉΓòÉΓòÉ
  1803.  
  1804. SendYes! currently provides english and german national language support. 
  1805.  
  1806. The SendYes! package contains a zip file with the language specific files for 
  1807. SendYes! in the english version. You are welcome to translate them to your 
  1808. language and email them to me if your language is not yet supported by 
  1809. SendYes!. Your name will show up in the SendYes! national language supporter 
  1810. section in the SendYes! version to follow. 
  1811.  
  1812. The language specific files are: 
  1813.  
  1814.  SNDYSENG.RCH        this file contains the strings used within the SendYes! 
  1815.                      GUI 
  1816.  
  1817.  SNDYSENG.H          this file contains the panel titles used within the 
  1818.                      SendYes! HLP and INF file 
  1819.  
  1820.  SNDYSENG.SRC        this file contains the source for the SendYes! HLP and INF 
  1821.                      file 
  1822.  
  1823.  SNDYSENG.TXT        this file contains the messages for the SendYes! 
  1824.                      installation program and deinstallation program. 
  1825.  
  1826.  MACROS.IPH and 
  1827.  SENDYES.H           these files contain the macros used within SNDYSENG.SRC. 
  1828.                      Translators should not modify these file, as they are not 
  1829.                      language specific. They are only supplied for to 
  1830.                      understand all the macros used within the IPF source file. 
  1831.  
  1832.  Refer also to section 
  1833.  
  1834.       The SendYes! package 
  1835.  
  1836.  
  1837. ΓòÉΓòÉΓòÉ 10.4. IPFC Preprocessor ΓòÉΓòÉΓòÉ
  1838.  
  1839. For developing both SendYes! HLP and INF files, the IPFC Preprocessor Version 
  1840. 1.0 by Doug Haigh is used. 
  1841.  
  1842. This preprocessor allows the use of 
  1843.  
  1844.      simple BookMaster macros with keyword and positional parameters which 
  1845.       greatly simplify the use of IPF links, autolinks and window positioning. 
  1846.  
  1847.      C header files can be imbedded via a special imbed tag (.imd). The 
  1848.       C-defines are resolved as BookMaster symbols and then can be used within 
  1849.       BookMaster macros. 
  1850.  
  1851.      imbedded files, which do not reside in the current directory. They are 
  1852.       also searched in the path given by the INCLUDE environment variable. 
  1853.  
  1854.      Bookmaster 1.0 Vanilla conditional compile variables. This allows to 
  1855.       conditional compile parts of the ipf source file for the HLP file and 
  1856.       other parts for the INF file, while the rest is compiled for both online 
  1857.       help files. This way it ias possible to have a single source file for to 
  1858.       compile both the HLP and the INF file. 
  1859.  
  1860.  For more information about the language specific files and the source for the 
  1861.  english version of the HLP and INF file, refer to section 
  1862.  
  1863.       national language support 
  1864.  
  1865.  
  1866. ΓòÉΓòÉΓòÉ 10.5. syslevel manager ΓòÉΓòÉΓòÉ
  1867.  
  1868. For creating the syslevel file for SendYes! the syslevel manager SLVMGR of 
  1869. Duane S. Wood is used. 
  1870.  
  1871. This program is out of a package that contains this manager as a command line 
  1872. utlility, a textfile, which describes the syslevel file format and a simple PM 
  1873. application for to create and / or edit syslevel files. 
  1874.  
  1875. The package was last updated in 1993, but the syslevel file format seems not to 
  1876. have changed meanwhile. 
  1877.  
  1878.  
  1879. ΓòÉΓòÉΓòÉ 11. Revision History ΓòÉΓòÉΓòÉ
  1880.  
  1881. Version 2.00 
  1882. Version 1.10 
  1883. Version 1.00 
  1884. Version 0.70 
  1885. Version 0.60 
  1886. file_id.diz 
  1887.  
  1888.  
  1889. ΓòÉΓòÉΓòÉ 11.1. Version 2.00 by C.Langanke (March 1, 1996) ΓòÉΓòÉΓòÉ
  1890.  
  1891.      national language support added. Messages, dialogs and help texts are 
  1892.       currently available in english and german. 
  1893.  
  1894.      The hook is now loaded by a separate executable rather than by 
  1895.       SENDYES.EXE. This way the amount of memory used by the active hook is 
  1896.       reduced to an absolute minimum while the user interface within 
  1897.       SENDYES.EXE can be enhanced in functionality. The hook executable is only 
  1898.       to be controlled by SENDYES.EXE. 
  1899.  
  1900.       For technical details about the SendYes! hook refer to section 
  1901.  
  1902.            The SendYes! PM hooks in Technical details 
  1903.  
  1904.      The executable loading the SendYes! hook dll is now excluded from the 
  1905.       shutdown processing. That way it remains in memory until all text 
  1906.       sessions have closed. 
  1907.  
  1908.      Calling SENDYES.EXE without any command line parameters brings up the new 
  1909.       SendYes! GUI. It consists of a notebook control, which you can nearly use 
  1910.       like a settings notebook of a WPS object. It allows the user to define 
  1911.       action profiles in order to specify any message boxes wich are to be 
  1912.       intercepted and processed automatically. 
  1913.  
  1914.       The GUI is using the functionality of the Direct Manipulation ListBox 
  1915.       (DMLB) control and the MultiColumn ListBox (MCLB) PM control to provide a 
  1916.       user friendly and though very fast GUI. 
  1917.  
  1918.       For more technical details refer to section 
  1919.  
  1920.            enhanced listbox controls in Technical details 
  1921.  
  1922.      SendYes! comes with three predefined action profiles for the confirmation 
  1923.       message boxes which come up when you want to close OS/2 and DOS VIO and 
  1924.       fullscreen text sessions or when you invoke a shutdown. 
  1925.       This way the functionality of previous versions of SendYes! is still 
  1926.       available without any need of customization by the user. 
  1927.  
  1928.      TESTALL.CMD has been removed. Testing for closing textsessions is now 
  1929.       done on the Actions Page within the SendYes! GUI. This way SendYes! can 
  1930.       take care of that the predefined action profiles are really active when 
  1931.       you test them. 
  1932.       Refer also to 
  1933.  
  1934.            How can I test predefined action profiles ? 
  1935.  
  1936.      SendYes! now comes with a installation program, which creates a SendYes! 
  1937.       folder on the desktop with several SendYes! WPS program objects in it, 
  1938.       and with a deinstallation program, which removes these objects again. 
  1939.  
  1940.       When you move the selection cursor within the SendYes! folder and select 
  1941.       one of the objects and press the F1 key, the appropriate help panel for 
  1942.       that object will pop up. 
  1943.  
  1944.      new command line parameters: 
  1945.  
  1946.         -  /LOAD 
  1947.         -  /UNLOAD 
  1948.         -  /ACTIVATE 
  1949.         -  /DEACTIVATE 
  1950.         -  /STATUS 
  1951.         -  /BATCH 
  1952.         -  /QUIET 
  1953.  
  1954.      removed command line parameters: 
  1955.  
  1956.         -  parameter /SWITCHENTRY is not longer supported. The hook executable 
  1957.            is to be controlled ONLY by the SendYes! GUI or via the parameters 
  1958.            /UNLOAD and /LOAD or /ACTIVATE and /DEACTIVATE for SENDYES.EXE. 
  1959.         -  parameter /CLOSE is replaced by the parameter /UNLOAD. The new 
  1960.            parameter does not close an active instance of SENDYES.EXE anymore, 
  1961.            but rather an active instance of the now separated hook executable. 
  1962.  
  1963.      Online help book added (you are just reading it). Note that the HLP file 
  1964.       for the SendYes! GUI is an excerpt from the INF file. 
  1965.  
  1966.      SendYes! now comes with a syslevel file that will show the version of 
  1967.       SendYes! when you execute the OS/2 syslevel command. 
  1968.       For more information on the SendYes! syslevel file refer also to 
  1969.  
  1970.            syslevel manager 
  1971.  
  1972.      most of the source is not distributed any longer. The SendYes! source now 
  1973.       has grown so big that I decided that from now on I distribute only 
  1974.  
  1975.         -  the source for the hook and the hook loading executable within this 
  1976.            INF file, because I think this is the source of most interest. 
  1977.  
  1978.         -  the source files for both the HLP and INF file. They contain some 
  1979.            technical hints for developing online help books with the IPFC 
  1980.            Preprocessor features like bookmaster macros and conditional compile 
  1981.            variables. 
  1982.  
  1983.       Refer to 
  1984.  
  1985.            The SendYes! PM hooks 
  1986.            IPFC Preprocessor 
  1987.            national language support 
  1988.  
  1989.       The other source files contain normal GUI stuff for which details can be 
  1990.       taken out of the programmers toolkit (from where also I got all the 
  1991.       Information). 
  1992.       If you have specific questions, don't hesitate to drop me a line and I 
  1993.       will do my best to answer you. 
  1994.  
  1995.  
  1996. ΓòÉΓòÉΓòÉ 11.2. Version 1.10 by C.Langanke (Oct 13, 1995) ΓòÉΓòÉΓòÉ
  1997.  
  1998.      SendYes! is now compiled with IBM C Set++ V2. 
  1999.       No need for the emx runtime anylonger. 
  2000.  
  2001.      New command line parameters: 
  2002.  
  2003.         -  parameter /? or /Help pops up a brief help 
  2004.         -  parameter /Close closes active SendYes! session. If SendYes! is not 
  2005.            active, you will receive an error msg box. 
  2006.         -  parameter /Batch surpesses msg boxes and generates 
  2007.            notification/alarm sounds instead 
  2008.         -  parameter /Switchentry creates a switch list equivalent to /S in 
  2009.            SendYes! V1.00 
  2010.         -  specifying the first letter of the parameters is sufficient, so /C 
  2011.            and /Close is equivalent 
  2012.         -  the parameters are case insensitive, so parameters /CLOSE, /Close 
  2013.            and /close are equivalent 
  2014.         -  the switch character preceding the parameters can be '/' or '-', so 
  2015.            parameters /Close and -Close are equivalent 
  2016.  
  2017.      An error msg box popup or error alarm is brought up, when 
  2018.  
  2019.         -  SendYes! is already active 
  2020.         -  SendYes! cannot be properly initialized 
  2021.         -  SendYes! is not active when to be closed with parameter /C 
  2022.         -  an invalid parameter was specified 
  2023.  
  2024.      An info msg box popup is brought up, when 
  2025.  
  2026.         -  SendYes! is closed successfully with parameter /C 
  2027.  
  2028.      Only message boxes with messages beginning with "This message may contain 
  2029.       an active program." are now closed. This prevents SendYes! from closing 
  2030.       ANY message box with MBID_YES, like it did before!  SendYes! reads the 
  2031.       apropriate message out of the PM resources, so it is language neutral. 
  2032.       Unfortunately the message used for closing OS/2 Fullscreen sessions is 
  2033.       slightly different in the second sentence, so the message is only 
  2034.       compared up to the end of the first sentence. 
  2035.       I hope that this will stay compatible with future versions of OS/2 and is 
  2036.       really compatible with all different language versions of OS/2. To test 
  2037.       it out: 
  2038.       Use TESTALL.CMD to bring up all four kind of sessions and close them with 
  2039.       SendYes! active: 
  2040.       if they close well without confirmation boxes, everything is fine. 
  2041.       If not, please email and tell me so... 
  2042.  
  2043.  
  2044. ΓòÉΓòÉΓòÉ 11.3. Version 1.00 by Wes Santee (August 26, 1995) ΓòÉΓòÉΓòÉ
  2045.  
  2046.      Now using emx0.9a, fix 6 (emxfix06.zip).  Be sure to get the updated 
  2047.       emxrt.zip runtime DLL's (see README.TXT) 
  2048.  
  2049.      '/S' parameter now tells SendYes! to put an entry in the switch list 
  2050.  
  2051.      SendYes! icon now bound to executable file 
  2052.  
  2053.  
  2054. ΓòÉΓòÉΓòÉ 11.4. Version 0.7 by Wes Santee (June 17, 1995) ΓòÉΓòÉΓòÉ
  2055.  
  2056.      Now using emx0.9a, fix 5 (emxfix05.zip).  Be sure to get the updated 
  2057.       emxrt.zip runtime DLL's. 
  2058.  
  2059.      Wouldn't close full-screen sessions.  Fixed. 
  2060.  
  2061.  
  2062. ΓòÉΓòÉΓòÉ 11.5. Version 0.6 by Wes Santee (May 29, 1995) ΓòÉΓòÉΓòÉ
  2063.  
  2064.      Initial release 
  2065.  
  2066.  
  2067. ΓòÉΓòÉΓòÉ 11.6. file_id.diz ΓòÉΓòÉΓòÉ
  2068.  
  2069. (v2.00) SendYes! - PM/WPS background utility
  2070. SendYes! processes standard message boxes
  2071. that you define SendYes! action profiles for
  2072. automatically and performs one of three
  2073. possible actions on one of the pushbuttons.
  2074. No more confirmation boxes for closing a
  2075. DOS or OS/2 windowed or fullscreen text
  2076. session if you don't like them. New GUI !
  2077. German and english NLS support ! Freeware !
  2078. Author/Maintainer: cla@oerag.de.
  2079.  
  2080.  
  2081. ΓòÉΓòÉΓòÉ 12. Credits ΓòÉΓòÉΓòÉ
  2082.  
  2083. Idea for SendYes! 
  2084. enhanced listbox controls 
  2085. IPFC Preprocessor 
  2086. syslevel manager 
  2087. SendYes! national language supporter 
  2088.  
  2089.  
  2090. ΓòÉΓòÉΓòÉ 12.1. Idea for SendYes! ΓòÉΓòÉΓòÉ
  2091.  
  2092. All credits for the idea and the creating of the first version of SendYes! 
  2093. belong to Wes Santee. 
  2094.  
  2095.  
  2096. ΓòÉΓòÉΓòÉ 12.2. enhanced listbox controls ΓòÉΓòÉΓòÉ
  2097.  
  2098. The SendYes! GUI makes use of new listbox controls, which very much enhance the 
  2099. functionality of a listbox. 
  2100.  
  2101. All credits for giving me that easy programming and you that flexible GUI 
  2102. handling belong to 
  2103.  
  2104.      Alan Warren of IBM, Yorktown Research and 
  2105.       Mark McMillan of IBM, Research Triangle Park, USA 
  2106.       for the Direct Manipulation ListBox (DMLB) control and 
  2107.      Charles Cooper of IBM, United Kingdom Warwick Development group and 
  2108.       Mark McMillan of IBM, Research Triangle Park, USA. 
  2109.       for the MultiColumn ListBox (MCLB) control. 
  2110.  
  2111.  For technical details refer to section 
  2112.  
  2113.       enhanced listbox controls in Technical details 
  2114.  
  2115.  
  2116. ΓòÉΓòÉΓòÉ 12.3. IPFC Preprocessor ΓòÉΓòÉΓòÉ
  2117.  
  2118. For precompilation of the source for both SendYes! HLP and INF files, the IPFC 
  2119. Preprocessor Version 1.0 by Doug Haigh is used. 
  2120.  
  2121. For technical details refer to section 
  2122.  
  2123.       IPFC Preprocessor in Technical details 
  2124.  
  2125.  
  2126. ΓòÉΓòÉΓòÉ 12.4. syslevel manager ΓòÉΓòÉΓòÉ
  2127.  
  2128. For creating the syslevel file for SendYes! the syslevel manager SLVMGR is 
  2129. used.  This program is from Duane S. Wood of OS/2 Development Boca Raton, 
  2130. Florida. 
  2131.  
  2132. For technical details refer to section 
  2133.  
  2134.       syslevel manager in Technical details 
  2135.  
  2136.  
  2137. ΓòÉΓòÉΓòÉ 12.5. SendYes! national language supporter ΓòÉΓòÉΓòÉ
  2138.  
  2139. Sorry, no translators yet ... 
  2140.  
  2141. If your language is not yet supported by SendYes! and you would like to help me 
  2142. supporting your language, refer to section national language support. 
  2143.  
  2144.  
  2145. ΓòÉΓòÉΓòÉ <hidden> right mouse button ΓòÉΓòÉΓòÉ
  2146.  
  2147. Using the right mouse button as stated in this online help file applies to you 
  2148. only if you did not change the settings of the Mouse object in the folder 
  2149. System Setup. 
  2150.  
  2151. The following settings of the following settings notebook pages impact the way 
  2152. SendYes! works concerning the usage of the right mouse button. If you change 
  2153. them, use the mouse the way you configured it. 
  2154. Note that the right mouse button is normally referred to as mouse button 2. 
  2155.  
  2156.  Setup 
  2157.  
  2158.              Left-handed mouse usage (switches mouse button 1 and 2) 
  2159.  
  2160.  Mappings 
  2161.  
  2162.              selecting mouse button 1 for drag and drop 
  2163.  
  2164.               Note:   If you drag action profiles with mouse button 1 the drag 
  2165.               cursor is not visible, but dragging still works. 
  2166.  
  2167.              selecting different settings for pop-up menus than single click 
  2168.               of button 2 without any control keys 
  2169.