SQABasic "MenuUtilities" Library

 MODULE DESCRIPTION:

      Routines for working with Window Menus and Popup Menus

Declarations Constants Global Variables User-Defined Types Routine Details

User Dependencies:

(stuff the developer's library/script $INCLUDES at compile time.)
(Note: The order of items may matter and may be different for your code.)

Internal Dependencies:

(stuff this library needs at compile time.)

Exported Declarations

Function MUGetMenuItemStrings    BasicLib MenuUtilities                 
Function MUGetMenuItemTextIndex  BasicLib MenuUtilities                 
Function MUGetMenuItemIndexText  BasicLib MenuUtilities                 
Function MUGetMatchedMenuItemTextIndex  BasicLib MenuUtilities                 
Function MUGetMenuItemTextSubMenuHandle  BasicLib MenuUtilities                 
Function MUGetMenuItemIndexSubMenuHandle  BasicLib MenuUtilities                 
Function MUGetMenuItemTextState  BasicLib MenuUtilities                 
Function MUGetMatchedMenuItemTextState  BasicLib MenuUtilities                 
Function MUGetMenuItemIndexState  BasicLib MenuUtilities                 
Function MUGetMenuItemIndexID    BasicLib MenuUtilities                 
Function IsMenuItemEnabled       BasicLib MenuUtilities                 
Function IsMenuItemGrayed        BasicLib MenuUtilities                 
Function IsMenuItemChecked       BasicLib MenuUtilities                 
Function IsMenuItemHiLited       BasicLib MenuUtilities                 
Function IsMenuItemABitmap       BasicLib MenuUtilities                 
Function IsMenuItemDefault       BasicLib MenuUtilities                 
Function IsMenuItemAMenu         BasicLib MenuUtilities                 
Function IsMenuItemAMenuBarBreak  BasicLib MenuUtilities                 
Function IsMenuItemAMenuBreak    BasicLib MenuUtilities                 
Function IsMenuItemAMenuSeparator  BasicLib MenuUtilities                 
Function MUGetMenuItemStateString  BasicLib MenuUtilities                 
Function MUVerifyTestStateString  BasicLib MenuUtilities                 
Function MUGetMenuHandleInfoFromHierarchy  BasicLib MenuUtilities                 
Function MUGetMenuInfoFromHierarchy  BasicLib MenuUtilities                 
Function MUGetMenuHandleInfoFromMenuID  BasicLib MenuUtilities                 
Function MUGetMenuInfoFromMenuID  BasicLib MenuUtilities                 
Function MUOutputMenuHandleStructure  BasicLib MenuUtilities                 
Function MUOutputMenuStructure   BasicLib MenuUtilities                 
Function MUGetActivePopupMenu    BasicLib MenuUtilities                 

Constants


Const MUStateFailure = &HFFFFFFFF&      'WIN32 GetState Failure code
Const MUStateFailureString = "MUStateFailure"

Const MUHierarchySeparator = "->"


Globals


    (none)

User-Defined Types


Type MenuInfo

    hMenu       As Long
    index       As Long
    ID          As Long
    state       As Long
    menuText    As String

End Type



Routine Details



  Function MUGetMenuItemStrings(hMenu As Long, menuStrings() As String) As Integer

 DESCRIPTION:

      Given a valid Menu handle and DIM'd string arraay the routine attempts to
      fill the array with the Strings of all the menuitems.

 PARAMETERS:

      hMenu           The handle of the Menu

      menuStrings     Dynamic string array to receive the names.  The array
                      should have been initialized as follows:

                          Dim menuStrings() As String


 RETURNS:

       N  the count of strings in the zero-based array

      -1  on failure

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release
      APR 19, 2004    (CANAGL) ANSI WIDE CHARACTER support.




  Function MUGetMenuItemTextIndex(hMenu as Long, menuText As String) As Integer

 DESCRIPTION:

      Given a valid Menu handle and text string the routine attempts to
      locate the position within the menu for the associated menuitem.
      MenuItem text that contains one or more underlined characters is
      represented in Windows by an ampersand (&) preceding each character
      that is underlined.  Our text comparisons use these ampersands when
      trying to match text as well.  This provides verification of the
      visual cues given the user for what keyboard shortcuts can be used on
      the menuitems.

      However, if the existence or position of the ampersand (the underlined
      character ) is NOT important, the menuText string can be provided void
      of ALL ampersand characters.  This routine will recognize that NO
      ampersands were provided and will strip the actual menuitem text of
      ampersands when doing the comparison.  This may possibly result in
      a false match (a match with the wrong menuitem), although this is
      probably unlikely.


 PARAMETERS:

      hMenu       The handle of the Menu

      menuText    Case-sensitive text to identify the menuitem with.

 RETURNS:

       N  zero-based index into the associated menu for the item with
          matching text.

      -1  on failure

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release
      APR 27, 2000    (CANAGL) Made ampersands optional in comparisons.




  Function MUGetMatchedMenuItemTextIndex(hMenu as Long,
                                         menuText As String,
                                         Optional occurrence) As Integer

 DESCRIPTION:

      Given a valid Menu handle and text string the routine attempts to
      locate the position within the menu for the menuitem containing the
      provided menuText.  This is a partial match mechanism.  If the
      optional occurrence argument is provided, then we look for the nth
      successful partial match in the hierarchy.  If no occurrence argument
      is provided, or it is invalid, then we seek the first match.

      MenuItem text that contains one or more underlined characters is
      represented in Windows by an ampersand (&) preceding each character
      that is underlined.  Our text comparisons use these ampersands when
      trying to match text as well.  This provides verification of the
      visual cues given the user for what keyboard shortcuts can be used on
      the menuitems.

      However, if the existence or position of the ampersand (the underlined
      character ) is NOT important, the menuText string can be provided void
      of ALL ampersand characters.  This routine will recognize that NO
      ampersands were provided and will strip the actual menuitem text of
      ampersands when doing the comparison.  This may possibly result in
      a false match (a match with the wrong menuitem), although this is
      probably unlikely.


 PARAMETERS:

      hMenu       The handle of the Menu

      menuText    Case-sensitive text to identify the menuitem with.  We are
                  only seeking a partial match.  The menuText must be found
                  somewhere in a menuItem.

      occurrence  Optional: an integer to specify which occurrence of the text
                  to match in the menu hierarchy.  By default, we look for
                  the first occurrence (occurrence=1) of the provided menuText.
                  Minimum value must be 1.

 RETURNS:

       N  zero-based index into the associated menu for the item with
          matching text.

      -1  on failure

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: APR 30, 2002
 History:

      APR 30, 2002    Original Release




  Function MUGetMenuItemIndexID(hMenu as Long, index As Long) As Long

 DESCRIPTION:

      Given a valid Menu handle and item index the routine attempts to
      return the menu ID for the associated menuitem.
      Currently, all we do is call the WIN32 API GetMenuItemID.

 PARAMETERS:

      hMenu       The handle of the Menu

      index       zero-based index into the menu for the menuitem.

 RETURNS:

       0      Item is a separator

      -1      Item is a popup menu

       N      the identifier for a true menuitem

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: AUG 02, 1999
 History:

      AUG 02, 1999    Original Release




  Function MUGetMenuItemIndexText(hMenu as Long, index As Long) As String

 DESCRIPTION:

      Given a valid Menu handle and item index the routine attempts to
      return the full text of the menuitem.
      Currently, all we do is call the WIN32 API GetMenuString.

 PARAMETERS:

      hMenu       The handle of the Menu

      index       zero-based index into the menu for the menuitem.

 RETURNS:

      The text of the menuItem on success, or an empty string on failure.

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: APR 30, 2002
 History:

      APR 30, 2002    Original Release




  Function MUGetMenuItemTextState(hMenu as Long, menuText As String) As Long

 DESCRIPTION:

      Given a valid Menu handle and text string the routine attempts to
      return the state information for the menuitem.

      The menuText can optionally include the ampersand character that
      normally precedes any underlined character in the menuitem.

 PARAMETERS:

      hMenu       The handle of the Menu

      menuText    Case-sensitive text to identify the menuitem with.

 RETURNS:

       state      Long status flag settings for the menuitem

       MUStateFailure     On failure. (see CONSTANTS)

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release




  Function MUGetMatchedMenuItemTextState(hMenu as Long,
                                         menuText As String,
                                         Optional occurrence) As Long

 DESCRIPTION:

      Given a valid Menu handle and text string the routine attempts to
      return the state information for the menuitem containing the
      provided menuText.  This is a partial match mechanism.  If the
      optional occurrence argument is provided, then we look for the nth
      successful partial match in the hierarchy.  If no occurrence argument
      is provided, or it is invalid, then we seek the first match.

      The menuText can optionally include the ampersand character that
      normally precedes any underlined character in the menuitem.

 PARAMETERS:

      hMenu       The handle of the Menu

      menuText    Case-sensitive text to identify the menuitem with.  We are
                  only seeking a partial match.  The menuText must be found
                  somewhere in a menuItem.

      occurrence  Optional: an integer to specify which occurrence of the text
                  to match in the menu hierarchy.  By default, we look for
                  the first occurrence (occurrence=1) of the provided menuText.
                  Minimum value must be 1.

 RETURNS:

       state      Long status flag settings for the menuitem

       MUStateFailure     On failure. (see CONSTANTS)

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: APR 30, 2002
 History:

      APR 30, 2002    Original Release




  Function MUGetMenuItemIndexState(hMenu as Long, index As Long) As Long

 DESCRIPTION:

      Given a valid Menu handle and index the routine attempts to
      return the state information for the menuitem.

 PARAMETERS:

      hMenu       The handle of the Menu

      index       the zero-based index of the item in the menu to get the
                  state information from

 RETURNS:

       state      Long status flag settings for the menuitem

       MUStateFailure     On failure. (see CONSTANTS)

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: AUG 02, 1999
 History:

      AUG 02, 1999    Original Release




  Function MUGetMenuItemTextSubMenuHandle(hMenu as Long, menuText As String) As Long

 DESCRIPTION:

      Given a valid Menu handle and text string the routine attempts to
      return a submenu handle for the menuItem pointed to by menuText.
      In other words, given a menu, find the menuitem whose text
      matches that provided and if that item itself has submenu items then
      return the handle to that submenu.

      The menuText can optionally include the ampersand character that
      normally precedes any underlined character in the menuitem.

 PARAMETERS:

      hMenu       The handle of the Menu

      menuText    Case-sensitive text to identify the menuitem with.

 RETURNS:

       hMnu   Handle to the submenu of the provided menuitem text

       0      failure

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release




  Function MUGetMenuItemIndexSubMenuHandle(hMenu as Long, index As Long) As Long

 DESCRIPTION:

      Given a valid Menu handle and index the routine attempts to
      return a submenu handle for the menuItem pointed to by the index.
      In other words, given a menu, find the nth menuitem and if that item
      itself has submenu items then return the handle to that submenu.

 PARAMETERS:

      hMenu       The handle of the Menu

      index       zero-based index of item in the menu

 RETURNS:

       hMnu   Handle to the submenu of the provided menuitem text

       0      failure

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: AUG 02, 1999
 History:

      AUG 02, 1999    Original Release




  Function IsMenuItemEnabled (state As Long) As Integer

 DESCRIPTION:

      Given state information gleaned from MUGetMenuItemTextState
      the routine attempts to return a True/False/Failure status for the unique
      state information requested.

 PARAMETERS:

      state       state information retrieved from MUGetMenuItemTextState.

 RETURNS:

       1  MenuItem is Enabled

       0  MenuItem is Disabled

      -1  Failure occurred

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release




  Function IsMenuItemGrayed (state As Long) As Integer

 DESCRIPTION:

      Given state information gleaned from MUGetMenuItemTextState
      the routine attempts to return a True/False/Failure status for the unique
      state information requested.

 PARAMETERS:

      state       state information retrieved from MUGetMenuItemTextState.

 RETURNS:

       1  MenuItem is Grayed

       0  MenuItem is Not Grayed

      -1  Failure occurred

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release




  Function IsMenuItemChecked (state As Long) As Integer

 DESCRIPTION:

      Given state information gleaned from MUGetMenuItemTextState
      the routine attempts to return a True/False/Failure status for the unique
      state information requested.

 PARAMETERS:

      state       state information retrieved from MUGetMenuItemTextState.

 RETURNS:

       1  MenuItem is Checked

       0  MenuItem is Unchecked

      -1  Failure occurred

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release




  Function IsMenuItemHiLited (state As Long) As Integer

 DESCRIPTION:

      Given state information gleaned from MUGetMenuItemTextState
      the routine attempts to return a True/False/Failure status for the unique
      state information requested.

 PARAMETERS:

      state       state information retrieved from MUGetMenuItemTextState.

 RETURNS:

       1  MenuItem is HiLited

       0  MenuItem is not HiLited

      -1  Failure occurred

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release




  Function IsMenuItemABitmap (state As Long) As Integer

 DESCRIPTION:

      Given state information gleaned from MUGetMenuItemTextState
      the routine attempts to return a True/False/Failure status for the unique
      state information requested.

 PARAMETERS:

      state       state information retrieved from MUGetMenuItemTextState.

 RETURNS:

       1  MenuItem is a Bitmap

       0  MenuItem is not a Bitmap

      -1  Failure occurred

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release




  Function IsMenuItemDefault (state As Long) As Integer

 DESCRIPTION:

      Given state information gleaned from MUGetMenuItemTextState
      the routine attempts to return a True/False/Failure status for the unique
      state information requested.

 PARAMETERS:

      state       state information retrieved from MUGetMenuItemTextState.

 RETURNS:

       1  MenuItem is the Default MenuItem

       0  MenuItem is not the Default

      -1  Failure occurred

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release




  Function IsMenuItemAMenu (state As Long) As Integer

 DESCRIPTION:

      Given state information gleaned from MUGetMenuItemTextState
      the routine attempts to return a True/False/Failure status for the unique
      state information requested.

 PARAMETERS:

      state       state information retrieved from MUGetMenuItemTextState.

 RETURNS:

       1  MenuItem is a Menu

       0  MenuItem is a regular MenuItem

      -1  Failure occurred

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release




  Function IsMenuItemAMenuBarBreak (state As Long) As Integer

 DESCRIPTION:

      Given state information gleaned from MUGetMenuItemTextState
      the routine attempts to return a True/False/Failure status for the unique
      state information requested.

 PARAMETERS:

      state       state information retrieved from MUGetMenuItemTextState.

 RETURNS:

       1  MenuItem is a MenuBarBreak

       0  MenuItem is not a MenuBarBreak

      -1  Failure occurred

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release




  Function IsMenuItemAMenuBreak (state As Long) As Integer

 DESCRIPTION:

      Given state information gleaned from MUGetMenuItemTextState
      the routine attempts to return a True/False/Failure status for the unique
      state information requested.

 PARAMETERS:

      state       state information retrieved from MUGetMenuItemTextState.

 RETURNS:

       1  MenuItem is a MenuBreak

       0  MenuItem is not a MenuBreak

      -1  Failure occurred

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release




  Function IsMenuItemAMenuSeparator (state As Long) As Integer

 DESCRIPTION:

      Given state information gleaned from MUGetMenuItemTextState
      the routine attempts to return a True/False/Failure status for the unique
      state information requested.

 PARAMETERS:

      state       state information retrieved from MUGetMenuItemTextState.

 RETURNS:

       1  MenuItem is a Menu Separator

       0  MenuItem is not a Menu Separator

      -1  Failure occurred

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release




  Function MUGetMenuItemStateString (state As Long) As String

 DESCRIPTION:

      Given state information gleaned from MUGetMenuItemTextState
      the routine converts it to a space-delimited string of all the state
      information known for the provided state.  Ex:

                  "Enabled Unchecked Ungrayed Unhilited Default"   OR

              "Enabled Unchecked Ungrayed Hilited Normal Menu With 5 MenuItems"

      Valid States:

          Enabled     Grayed      BarBreak                Bitmap
          Disabled    Ungrayed    Separator               Break
          Checked     Hilited     Default                 Menu With N MenuItems
          Unchecked   Unhilited   Normal (not default)


 PARAMETERS:

      state       state information retrieved from MUGetMenuItemTextState.

 RETURNS:

      String  Space-delimited string of state information.
              If the state code provided = MUStateFailure then
              the return string contains that.

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 29, 1999
 History:

      JUL 29, 1999    Original Release




  Function MUVerifyTestStateString (testState AS String,
                                    menuState AS String) As Integer

 DESCRIPTION:

      Verify that each space-delimited state found in testState exists
      as provided in the overall menuState string.

      testState = "Enabled Menu With 5 MenuItems"

          should match successfully with:

      menuState = "Enabled Unchecked Ungrayed Hilited Normal Menu With 5 MenuItems"

      Valid States:

          Enabled     Grayed      BarBreak                Bitmap
          Disabled    Ungrayed    Separator               Break
          Checked     Hilited     Default                 Menu With N MenuItems
          Unchecked   Unhilited   Normal (not default)


 PARAMETERS:

      testState   the particular STATE(s) we are looking to match.

      menuState   the entire STATE string of the menuItem.

 RETURNS:

      1   on successful match of the state information.

      0   on any error\failure.

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: AUG 07, 2000
 History:

      AUG 07, 2000    Original Release




  Function MUGetMenuInfoFromHierarchy (hWnd As Long, hierarchy As String,
                                       info As MenuInfo, Optional match) As Integer

 DESCRIPTION:

      Given a menu hierarchy string of the form "Menu->Menu->MenuItem" the
      routine attempts to locate the menuitem using the Window handle
      provided.  If it finds the MenuItem within the menu it retrieves and
      stores all the information about the menuitem into the provided
      MenuInfo structure.

      If the optional match parameter is set to 1 then we will perform
      partial matches on our menuItem strings.

 PARAMETERS:

      hWnd        The handle of the Window to evaluate the menu structure on.

      hierarchy   String representation of the hierarchy to evaluate.  Menus
                  and Menuitems should be separated by "->" to signify the
                  parent\child structure.  Ex: for the NT Explorer window,
                  the sequence to identify File\New\Folder would be:

                          "&File->Ne&w->&Folder"

                  NOTE: the ampersands indicating an underlined menuitem are
                  optional for a valid match.  Spaces and key combination
                  text that may occur on the line with the menuitem are required
                  unless the "match" parameter is provided and set to 1.

      info        A MenuInfo structure to fill if the menuitem is found.
                  Upon entry all numberic values are set to -1 except for the
                  hMenu field which is set to 0.
                  Text values are set to "".
                  As the hierarchy is traversed the structure is filled with the
                  information of the current item in the hierarchy.  Thus if
                  the routine exits with failure at some point in the hierarchy
                  a snapshot of where we were at is returned in the structure.

      match       Optional: set to 1 to perform partial text matches on menuItems.
                  Currently, we only match to the first occurrence of a matching
                  menuItem substring on each menu level in the hierarchy.

 RETURNS:

      -1      successfully found the menuitem and filled the MenuInfo structure.

       0      failed. Invalid Window handle, hierarchy string, or some other error.

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: AUG 03, 1999
 History:

      AUG 03, 1999    Original Release
      AUG 07, 2000    (CANAGL) Converted to shared GetHierarchyInfo routine.
      APR 30, 2002    (CANAGL) Enabled partial text matches.




  Function MUGetMenuHandleInfoFromHierarchy (hmenu As Long, hierarchy As String,
                                       info As MenuInfo, Optional match) As Integer

 DESCRIPTION:

      Given a menu hierarchy string of the form "Menu->Menu->MenuItem" the
      routine attempts to locate the menuitem using the menu handle
      provided.  If it finds the MenuItem within the menu it retrieves and
      stores all the information about the menuitem into the provided
      MenuInfo structure.

      If the optional match parameter is set to 1 then we will perform
      partial matches on our menuItem strings.

 PARAMETERS:

      hmenu       The handle of the menu to evaluate the structure on.

      hierarchy   String representation of the hierarchy to evaluate.  Menus
                  and Menuitems should be separated by "->" to signify the
                  parent\child structure.  Ex: for the NT Explorer window,
                  the sequence to identify File\New\Folder would be:

                          "&File->Ne&w->&Folder"

                  NOTE: the ampersands indicating an underlined menuitem are
                  optional for a valid match.  Spaces and key combination
                  text that may occur on the line with the menuitem are required
                  unless the "match" parameter is provided and set to 1.

      info        A MenuInfo structure to fill if the menuitem is found.
                  Upon entry all numberic values are set to -1 except for the
                  hMenu field.
                  Text values are set to "".
                  As the hierarchy is traversed the structure is filled with the
                  information of the current item in the hierarchy.  Thus if
                  the routine exits with failure at some point in the hierarchy
                  a snapshot of where we were at is returned in the structure.

      match       Optional: set to 1 to perform partial text matches on menuItems.
                  Currently, we only match to the first occurrence of a matching
                  menuItem substring on each menu level in the hierarchy.

 RETURNS:

      -1      successfully found the menuitem and filled the MenuInfo structure.

       0      failed. Invalid handle, hierarchy string, or some other error.

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: AUG 07, 2000
 History:

      AUG 07, 2000    Original Release
      APR 30, 2002    (CANAGL) Enabled partial text matches.




  Function MUGetMenuHandleInfoFromMenuID (hmenu As Long, menuID As Long,
                                       info As MenuInfo) As Integer

 DESCRIPTION:

      Given a menuID the routine attempts to locate the menuitem using the
      menu handle provided.  If it finds the MenuItem within the menu it
      retrieves and stores all the information about the menuitem into the
      provided MenuInfo structure.

 PARAMETERS:

      hmenu       The handle of the menu to evaluate the structure on.

      menuID      The menuID of the menuitem to evaluate.  This is generally
                  used when the menuitem is a bitmap or other item that does
                  not have text.  This value can be retrieved from the the menu
                  by index or by manual lookup from a menu structure output
                  from MUOutputMenuStructure.

      info        A MenuInfo structure to fill if the menuitem is found.
                  Upon entry all numberic values are set to -1 except for the
                  hMenu field.  Text values are set to "".
                  As the menu hierarchy is traversed the structure is filled with
                  the information of the current item in the hierarchy.  Thus if
                  the routine exits with failure at some point in the hierarchy
                  a snapshot of where we were at is returned in the structure.

 RETURNS:

      -1      successfully found the menuitem and filled the MenuInfo structure.

       0      failed. Invalid handle, menuID, or some other error.

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: AUG 07, 2000
 History:

      AUG 07, 2000    Original Release




  Function MUGetMenuInfoFromMenuID (hWnd As Long, menuID As Long,
                                       info As MenuInfo) As Integer

 DESCRIPTION:

      Given a menuID the routine attempts to locate the menuitem using the
      Window handle provided.  If it finds the MenuItem within the menu it
      retrieves and stores all the information about the menuitem into the
      provided MenuInfo structure.

 PARAMETERS:

      hWnd        The handle of the Window to evaluate the menu structure on.

      menuID      The menuID of the menuitem to evaluate.  This is generally
                  used when the menuitem is a bitmap or other item that does
                  not have text.  This value can be retrieved from the the menu
                  by index or by manual lookup from a menu structure output
                  from MUOutputMenuStructure.

      info        A MenuInfo structure to fill if the menuitem is found.
                  Upon entry all numberic values are set to -1 except for the
                  hMenu field which is set to 0.  Text values are set to "".
                  As the menu hierarchy is traversed the structure is filled with
                  the information of the current item in the hierarchy.  Thus if
                  the routine exits with failure at some point in the hierarchy
                  a snapshot of where we were at is returned in the structure.

 RETURNS:

      -1      successfully found the menuitem and filled the MenuInfo structure.

       0      failed. Invalid Window handle, menuID, or some other error.

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: AUG 03, 1999
 History:

      AUG 03, 1999    Original Release
      AUG 07, 2000    (CANAGL) Added some parameter validation.




  Function MUOutputMenuHandleStructure (hmenu As Long, path as String,
                                  overwrite As Integer, recurse As Integer,
                                  showState As Integer, Optional description
                                 ) As Integer

 DESCRIPTION:

      Given a valid handle the routine retrieves the menu structure, formats
      it as text, and saves it to a file or outputs it to the SQAConsole.
      You can choose to append or overwrite the existing file (if any) and
      you can choose to do only one level or the entire menu system.

 PARAMETERS:

      hmenu       handle of the menu to work with

      path        full path and name of file to use/make as output
                  if path="" the output is directed to the console.

      overwrite   <>1 = Append the file if it already exists.
                   1 = Overwrite the file if it already exists.

      recurse     <>1 = Output only the top level menu information.
                   1  = Recursively output ALL menu information.

      showState   <>1 = Do not show any state information
                   1  = Show the state string of each menuitem

      description   Optional text to place at start of output.
                    This should be something which identifies which window
                    or which state of the application the snapshot was
                    taken from.  Without this, the output gives no indication
                    of where it came from.

 RETURNS:

       0  success

      +N  SQAError code resulting from call to file Open.
     -99  Invalid parameters on entry

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: AUG 07, 2000
 History:

      AUG 07, 2000    Original Release




  Function MUOutputMenuStructure (hWnd As Long, path as String,
                                  overwrite As Integer, recurse As Integer,
                                  showState As Integer, Optional description
                                 ) As Integer

 DESCRIPTION:

      Given a valid handle the routine retrieves the menu structure, formats
      it as text, and saves it to a file or outputs it to the SQAConsole.
      You can choose to append or overwrite the existing file (if any) and
      you can choose to do only one level or the entire menu system.

 PARAMETERS:

      hWnd        handle of the Window to work with

      path        full path and name of file to use/make as output
                  if path="" the output is directed to the console.

      overwrite   <>1 = Append the file if it already exists.
                   1 = Overwrite the file if it already exists.

      recurse     <>1 = Output only the top level menu information.
                   1  = Recursively output ALL menu information.

      showState   <>1 = Do not show any state information
                   1  = Show the state string of each menuitem

      description   Optional text to place at start of output.
                    This should be something which identifies which window
                    or which state of the application the snapshot was
                    taken from.  Without this, the output gives no indication
                    of where it came from.

 RETURNS:

       0  success

      +N  SQAError code resulting from call to file Open.
      -1  Handle item does not have a menu.
     -99  Invalid parameters on entry

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: JUL 30, 1999
 History:

      JUL 30, 1999    Original Release
      AUG 07, 2000    (CANAGL) Mod to use OutputMenuHandleStructure




  Function MUGetActivePopupMenu () As Long

 DESCRIPTION:

      Attempts to retrieve the handle of the topmost active popup menu.
      The routine will temporarily load and unload the CWPHooker.DLL if it
      is not already active.  If the DLL is already loaded, this routine will
      NOT unload it. (See CWPHooker documentation on the use of this DLL.)

      If we cannot find an active popup, the routine will attempt a keyboard
      sequence of {Down} to force a WM_MENUSELECT message.  Thus, if you
      call this routine when there is no active popup menu then your
      application may receive this keyboard input and produce an unpredictable
      application state.
      (Note, however, we try to minimize this possibility by only sending
       the keyboard {Down} if the topmost window is of the same class as
       popup menus--#32768.)

 PARAMETERS:

      none

 RETURNS:

      Non-Zero handle to the active popup menu   OR
      0   if an error occurred or no popup menu was found.

 ERRORS:

       none

 Orig Author: Carl Nagle
 Orig   Date: AUG 07, 2000
 History:

      AUG 07, 2000    Original Release


Copyright (C) SAS Institute
GNU General Public License: http://www.opensource.org/licenses/gpl-license.php 
==============================================================================