File "FindDialog.inc"

Path: /dlg-utils/FindDialog.inc
File size: 4.51 KB
MIME-type:
Charset: utf-8

'--------------------------------------------------------------------------------------------
' This is "FindDialog.inc"
' It returns the number of dialog founds based on a filter (1st parameter),
' and fills a dialog information array passed as second parameter.
'--------------------------------------------------------------------------------------------
DECLARE FUNCTION FindDialog(BYVAL filter AS STRING, BYREF dlgList() AS STRING) AS LONG
'--------------------------------------------------------------------------------------------
' Examples of use:
'       LOCAL nbDlg as LONG
'
'       ' Following returns dialogs based on all-or-part of a caption string
'       nbDlg = FindDialog(BYVAL "CAP:Explorer", BYREF dlgList())
'
'       ' Following returns dialog information based on a dialog handle,
'       ' in this case 'nbDlg' is either 0 (no dialog found) or 1 (dialog found)
'       nbDlg = FindDialog(BYVAL "HND:12345", BYREF dlgList())
'--------------------------------------------------------------------------------------------
' dlgList() will contain:
'       dlgList(0) = "#12345:Full dialog caption",
'       dlgList(1) = "#23456:Second full dialog caption",
'       ...
'       dlgList(nbDlg-1) = "#99999:Another dialog caption"
'--------------------------------------------------------------------------------------------

'--------------------------------------------------------------------------------------------
TYPE WINDOWLIST
   hwnd AS DWORD
   PARENT AS LONG
   R AS RECT
END TYPE
'--------------------------------------------------------------------------------------------

'--------------------------------------------------------------------------------------------
GLOBAL fd_wList() AS WINDOWLIST
GLOBAL fd_iCount, fd_iResult AS LONG
'--------------------------------------------------------------------------------------------

'--------------------------------------------------------------------------------------------
MACRO fdM_AddToFoundDlg
    INCR foundDlg
    dlgList(foundDlg-1) = "#" + FORMAT$(fd_wList(i).hwnd) + ":" + TRIM$(szText)
END MACRO
'--------------------------------------------------------------------------------------------

'--------------------------------------------------------------------------------------------
FUNCTION FindDialog(BYVAL filter AS STRING, BYREF dlgList() AS STRING) AS LONG
    LOCAL szText AS ASCIIZ * %MAX_PATH
    LOCAL foundDlg AS LONG
    LOCAL i AS LONG

    REDIM fd_wList(5000)
    REDIM dlgList(5000)

    fd_iResult = EnumWindows(CODEPTR(ParentCallback), 0&)
    REDIM PRESERVE fd_wList(fd_iCount)
    REDIM PRESERVE dlgList(fd_iCount)

    FOR i = 0 TO UBOUND(fd_wList)
        fd_iResult = GetWindowText(fd_wList(i).hwnd, szText, SIZEOF(szText))

        SELECT CASE LEFT$(UCASE$(filter),4)

            CASE "CAP:" ' "CAP:All-Or-Part-Of-Caption"
            IF INSTR(LCASE$(szText), "cmd.exe - " + LCASE$(EXE.NAME$)) = 0 _
              AND INSTR(LCASE$(szText), LCASE$(MID$(filter,5))) > 0 THEN
                fdM_AddToFoundDlg
            END IF

            CASE "HND:" ' "HND:12345"
            IF VAL(MID$(filter,5)) = fd_wList(i).hwnd THEN
                fdM_AddToFoundDlg
            END IF

        END SELECT
    NEXT i

    REDIM PRESERVE dlgList(foundDlg-1)
    FUNCTION = foundDlg
END FUNCTION
'--------------------------------------------------------------------------------------------

'--------------------------------------------------------------------------------------------
FUNCTION ChildCallback (BYVAL hWndChild AS LONG, lRaram AS LONG) AS LONG
    INCR fd_iCount
    fd_wList(fd_iCount).hWnd = hWndChild
    FUNCTION = 1
END FUNCTION
'--------------------------------------------------------------------------------------------

'--------------------------------------------------------------------------------------------
FUNCTION ParentCallback (BYVAL hWndChild AS LONG, lRaram AS LONG) AS LONG
    LOCAL szParentClass AS ASCIIZ * %Max_Path
    fd_iResult = GetClassName(hWndChild, szParentClass, SIZEOF(szParentClass))
    INCR fd_iCount
    fd_wList(fd_iCount).PARENT = 1
    fd_wList(fd_iCount).hWnd = hWndChild
    SELECT CASE szParentClass
       CASE "COMBOBOX", "COMBOBOXEX32", "SYSIPADDRESS32", "SYSLISTVIEW32", _
            "SYSTABCONTROL32", "SYSDATATIMEPICK32"
         'do nothing
       CASE ELSE
         IF IsWindowVisible(hWndChild) THEN
             fd_iResult = EnumChildWindows(hWndChild, CODEPTR(ChildCallback), 0&)
         END IF
    END SELECT
    FUNCTION = 1
END FUNCTION
'--------------------------------------------------------------------------------------------