Цитата:
Сообщение от
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() ) ) ) ;
}
}