|
![]() |
#1 |
Участник
|
Форма, которая активна. Или на которой сейчас мышь. Не секрет: чтобы открыть другое приложение в котором форма так-же называется как и в АХ.
|
|
![]() |
#2 |
Участник
|
Возможно ли с помощью класса Infolog (или другого) выяснить какие формы были открыты?
X++: infolog.parmLastActivatedForm().object().name() Храниться ли где-нибудь эта информация? |
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от Dima_Dima
![]() Возможно ли с помощью класса Infolog (или другого) выяснить какие формы были открыты?
X++: infolog.parmLastActivatedForm().object().name() Храниться ли где-нибудь эта информация? Возможно вот это чем-то поможет: http://www.axaptapedia.com/DEV_Tabax..._RecentWindows |
|
|
За это сообщение автора поблагодарили: belugin (2), Dima_Dima (1). |
![]() |
#4 |
Боец
|
Можно обойтись и без сторонних плагинов, например встроиться в метод new класса SysSetupFormRun:
X++: public void run() { super(); // 13.01.09 DSPIC --> info (strfmt("Activated: %1", this.design().caption())); // 13.01.09 DSPIC <-- } Правда в этом случае, будут фиксироваться только formRun-формы, не системные. |
|
|
За это сообщение автора поблагодарили: Dima_Dima (1). |
![]() |
#5 |
Участник
|
Цитата:
В качестве примера вот что получилось для DAx 4.0, с учетом дополнительно открытых рабочих областей: X++: static void jbShowAxWindowList(Args _args) { DLLFunction dllFunctionIsWindowVisible ; DLLFunction dllFunctionGetClassName ; container conWorkspaceListWnd ; Counter counterWorkspace ; Counter counterWindowTotal ; HWND hWndAxWorkspace ; #define.WorkspaceView(0) // 0 - all workspaces, 1 - only current workspace #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 ) ; } boolean isWindowVisible( HWND _hWnd ) // Win32 API IsWindowVisible function { DLL dllUser ; ; if( !dllFunctionIsWindowVisible ) { dllUser = new DLL( #UserDLL ) ; dllFunctionIsWindowVisible = new DLLFunction( dllUser, 'IsWindowVisible' ) ; dllFunctionIsWindowVisible.returns( ExtTypes::Word ) ; dllFunctionIsWindowVisible.arg( ExtTypes::DWord ) ; } return dllFunctionIsWindowVisible.call( _hWnd ) ; } Counter showWorkspaceVisibleWindowList( HWND _hWndWorkspace, int _workspaceNum = 0 ) { HWND hWndClientMDI ; HWND hWndAxMDI ; HWND hWndAxPane ; TempStr tempStr ; IdentifierName objectName ; Name workSpaceName ; Counter counterWindow ; System.Text.RegularExpressions.Match sysMatch; #define.MdiClientWndClass('MDIClient') #define.AxMainFrameWndClassName('AxMainFrame') #define.AxMdiChildWndClassName('AxMDIChildWindow') #define.AxPaneWndClassName('AxPaneWnd') ; if( getClassName( _hWndWorkspace ) != #AxMainFrameWndClassName ) throw error( strfmt( "Invalid class name of window %1", _hWndWorkspace ) ) ; workSpaceName = WinAPI::getWindowText( _hWndWorkspace ) ; setprefix( workSpaceName ) ; if( !_workspaceNum && workSpaceName ) // if '_workspaceNum' not specified (=0), try get him from main window caption { sysMatch = System.Text.RegularExpressions.Regex::Match( workSpaceName, @'\d+' ) ; if( sysMatch.get_Success() ) { tempStr = sysMatch.get_Value() ; _workspaceNum = str2int( tempStr ) ; } } hWndClientMDI = WinApi::findWindowEx( _hWndWorkspace, 0, #MdiClientWndClass, '' ) ; hWndAxMDI = WinApi::findWindowEx( hWndClientMDI, 0, #AxMdiChildWndClassName, '' ); while( hWndAxMDI ) { if( isWindowVisible( hWndAxMDI ) ) { hWndAxPane = WinAPI::findWindowEx( hWndAxMDI, 0, #AxPaneWndClassName, '' ) ; objectName = WinAPI::getWindowText( hWndAxPane ) ; // try get 'internal' formRun name counterWindow++ ; info( strfmt( "%1%2%3%4 [HWND: %5]", _workspaceNum ? int2str( _workspaceNum ) + ' - ' : '', objectName, objectName ? ' : ' : '', WinAPI::getWindowText( hWndAxMDI ), hWndAxMDI ) ) ; } hWndAxMDI = WinAPI::getWindow( hWndAxMDI, #GW_HWNDNEXT ) ; // next AxMDI window } return counterWindow ; } ; info( "Dynamics AX window list" ) ; #if.WorkspaceView(0) // all workspaces conWorkSpaceListWnd = infolog.getWorkspaceList() ; for( counterWorkspace = 1; counterWorkspace <= conlen( conWorkSpaceListWnd ); counterWorkspace++ ) { hWndAxWorkspace = conpeek( conWorkSpaceListWnd, counterWorkspace ) ; counterWindowTotal += showWorkspaceVisibleWindowList( hWndAxWorkspace ) ; } #endif // WorkspaceView(0) #if.WorkspaceView(1) // only current workspace counterWindowTotal = showWorkspaceVisibleWindowList( infolog.hWnd( xInfo::currentWorkspaceNum() ), xInfo::currentWorkspaceNum() ) ; #endif // WorkspaceView(1) info( strfmt( "Listed %1 windows", counterWindowTotal ) ) ; } |
|
|
За это сообщение автора поблагодарили: Dima_Dima (1). |
![]() |
#6 |
Участник
|
А как быть с формами, которые в DAX2009 открываются в других (отдельных) окнах? Предложенный petergunn механизм отображает только заголовки форм, открытых в основном окне аксапты.
|
|
![]() |
#7 |
Участник
|
Это не очень прояснило постановку задачи. Чего вы в итоге хотите? Если у вас есть возможность в "другом приложении" пускаться во все тяжкие ради поиска заголовка нужной формы или если вы можете повлиять на это приложение из Аксапты, то почему не воспользоваться в самой Аксапте какими-то более "прямыми" путями открытия формы? Может, ActiveX-элемент встроить в форму или .net-сборку подключить, если версия ядра Аксапты позволяет...
Последний раз редактировалось gl00mie; 20.11.2009 в 23:56. Причина: дополнение |
|
![]() |
#8 |
Участник
|
DAX 2012
Добрый день! Подскажите как в DAX 2012 определить запущена рабочая оболасть разработки или нет?
|
|