|
|
#1 |
|
Участник
|
получить по hwnd FormName
Есть hwnd всех дочерних окон Axapta
Как получить по ним FormName этих окон? И далее подцепиться к определенному окну если оно запущено? то есть хочется что-то типа: X++: FormRun GetActiveForm(FormName _formName)
{
container con = getWindows();
FormRun fr;
int c;
;
for(c=1;c<=conlen(con);c++)
//выделенного жирным то и нет
if ([B]getNamefromhWnd[/B](conpeek(con,c)) == _formName)
{
fr = classFactory.formRunClass(new Args(_formName));
fr.init();
break;
}
return fr;
}Последний раз редактировалось player; 24.10.2007 в 14:27. Причина: косметические исправления |
|
|
|
|
#2 |
|
Участник
|
можно только последнюю активизированную форму узнать \Classes\Info\setLastActivatedForm у нее есть hWnd. Только надо учесть, что там хранится слабая ссылка на нее, которую надо хватать, а то по ходу дела исчезнет. См. исходники табакса и \Classes\TabaxPlugin_RecentWindows Ивана Кашперука
|
|
|
|
| За это сообщение автора поблагодарили: player (1). | |
|
|
#3 |
|
Участник
|
hwnd у меня как-раз таки есть, мне нужно активировать нужное окно, и поуправлять его контролами... Например, есть массив hwnd окон открытых в системе [1345, 12367, 5674, 11567, 3498, 2345] нужно узнать кто из них "PurchTable", активировать его (это проще всего infolog.activatewindow(hwnd) ) и "поиграть" его контролами, зная их ID.
|
|
|
|
|
#4 |
|
MCTS
|
Взято отсюда
text = WinApi::getWindowText(handle);
__________________
![]() В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню Последний раз редактировалось Russland; 26.10.2007 в 10:23. |
|
|
|
|
#5 |
|
Участник
|
там лежит формран, у него есть hwnd, вы можете по таймеру сканировать окна и запоминать последние активированные и класть их в Map <hWnd --> formRun> после чего его доставать и манипулировать.
|
|
|
|
|
#6 |
|
Участник
|
Цитата:
Сообщение от Russland
Взято отсюда
text = WinApi::getWindowText(handle); Упреждая игры с WinAPI - winapi::getclassname вернет AxMDIChildWindow, и в getclassinfo тоже ничего полезного вроде нет...
|
|
|
|
|
#7 |
|
Участник
|
player, да обратите же вы наконец внимание на то, что пишет Белугин Максим.
Вы же не первый, кто пытался сделать что-то подобное. Через hwnd нельзя получить FormRun, если для этого специально не сохранять ссылку на последнего, запоминая его hwnd |
|
|
|
|
#8 |
|
Участник
|
Спасибо.
Уже обратил и усиленно смотрю sources tabax+ TabaxPlugin_RecentWindows (еще раз спасибо ), а Russland отвечал скорее для истории, чтобы те кто будут читать позже не подумали, что этот ответ полностью снимает проблему.
|
|
|
|
|
#9 |
|
Участник
|
DAX 4.0
Цитата:
![]() В этой теме приводил пример 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 ) : '' ;
}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). | |
|
|
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|