Показать сообщение отдельно
Старый 19.01.2009, 16:41   #7  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
DAX 4.0
Цитата:
Сообщение от player Посмотреть сообщение
Это будет Caption, а не Name в АOT,
Упреждая игры с WinAPI - winapi::getclassname вернет AxMDIChildWindow, и в
getclassinfo тоже ничего полезного вроде нет...
Как давно (10.2007) это было
В этой теме приводил пример job'а для DAX 4.0 по перечислению MDI окон и отображения их заголовков. Похоже для DAX 4.0 все же можно вытянуть название формы в виде 'как бы из AOT' по ее HWND - как заголовок дочернего окна AxPaneWnd:

X++:
IdentifierName formNameInAOT( HWND _hWndAx )
{
    HWND    hWndAxPane  ;
    TempStr strWindowClassName = getClassName( _hWndAx ) ;

    #define.AxMdiChildWndClassName('AxMDIChildWindow')
    #define.AxChildFrameClassName('AxChildFrame')
    #define.AxPaneWndClassName('AxPaneWnd')
    ;

    if( strWindowClassName != #AxMdiChildWndClassName //  Ax MDI Child Window ?
        //&& strWindowClassName != #AxChildFrameClassName //  or Ax Child Frame Window ?
        )
            return '' ;

    hWndAxPane = WinAPI::findWindowEx( _hWndAx, 0, #AxPaneWndClassName, '' ) ;
    return hWndAxPane ? WinAPI::getWindowText( hWndAxPane ) : '' ;
}
Для демонстрации - пример job'а для извлечения имени последней открытой формы по HWND:
X++:
static void jbNameInAOTByHWND(Args _args)
{
    FormRun         formRun ;
    DLLFunction     dllFunctionGetClassName     ;

    #define.UserDLL( 'USER32' )
    #WinAPI

    str getClassName( HWND _hWnd )  //  Win32 API GetClassName function
    {
        #define.nMaxCount(512)

        DLL     dllUser ;
        Binary  binaryClassName = new Binary( #nMaxCount *2 ) ;
        ;

        if( !dllFunctionGetClassName )
        {
            dllUser = new DLL( #UserDLL ) ;
            dllFunctionGetClassName = new DLLFunction( dllUser, 'GetClassNameW' ) ;
            dllFunctionGetClassName.returns( ExtTypes::DWord ) ;
            dllFunctionGetClassName.arg( ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord ) ;
        }

        if( !dllFunctionGetClassName.call( _hWnd, binaryClassName, #nMaxCount ) )
            return '' ;

        return binaryClassName.wString( 0 ) ;
    }

    IdentifierName formNameInAOT( HWND _hWndAx )
    {
        HWND    hWndAxPane  ;
        TempStr strWindowClassName = getClassName( _hWndAx ) ;

        #define.AxMdiChildWndClassName('AxMDIChildWindow')
        #define.AxChildFrameClassName('AxChildFrame')
        #define.AxPaneWndClassName('AxPaneWnd')
        ;

        if( strWindowClassName != #AxMdiChildWndClassName //  Ax MDI Child Window ?
            //&& strWindowClassName != #AxChildFrameClassName //  or Ax Child Frame Window ?
            )
            return '' ;

        hWndAxPane = WinAPI::findWindowEx( _hWndAx, 0, #AxPaneWndClassName, '' ) ;
        return hWndAxPane ? WinAPI::getWindowText( hWndAxPane ) : '' ;
    }
    ;

    if( infolog.setLastActivatedForm() )
        formRun = infolog.setLastActivatedForm().object() ;

    if( formRun )
    {
        info( strfmt( "FormRun name in AOT: %1", formRun.name() ) ) ;
        info( strfmt( "by HWND name in AOT: %1", formNameInAOT( formRun.hWnd() ) ) ) ;
    }
}
За это сообщение автора поблагодарили: Logger (1), player (1).