24.10.2007, 14:23 | #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. Причина: косметические исправления |
|
24.10.2007, 14:53 | #2 |
Участник
|
можно только последнюю активизированную форму узнать \Classes\Info\setLastActivatedForm у нее есть hWnd. Только надо учесть, что там хранится слабая ссылка на нее, которую надо хватать, а то по ходу дела исчезнет. См. исходники табакса и \Classes\TabaxPlugin_RecentWindows Ивана Кашперука
|
|
|
За это сообщение автора поблагодарили: player (1). |
26.10.2007, 08:29 | #3 |
Участник
|
hwnd у меня как-раз таки есть, мне нужно активировать нужное окно, и поуправлять его контролами... Например, есть массив hwnd окон открытых в системе [1345, 12367, 5674, 11567, 3498, 2345] нужно узнать кто из них "PurchTable", активировать его (это проще всего infolog.activatewindow(hwnd) ) и "поиграть" его контролами, зная их ID.
|
|
26.10.2007, 10:18 | #4 |
MCTS
|
Взято отсюда
text = WinApi::getWindowText(handle);
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню Последний раз редактировалось Russland; 26.10.2007 в 10:23. |
|
26.10.2007, 10:19 | #5 |
Участник
|
там лежит формран, у него есть hwnd, вы можете по таймеру сканировать окна и запоминать последние активированные и класть их в Map <hWnd --> formRun> после чего его доставать и манипулировать.
|
|
28.10.2007, 07:51 | #6 |
Участник
|
Цитата:
Сообщение от Russland
Взято отсюда
text = WinApi::getWindowText(handle); Упреждая игры с WinAPI - winapi::getclassname вернет AxMDIChildWindow, и в getclassinfo тоже ничего полезного вроде нет... |
|
28.10.2007, 12:31 | #7 |
Участник
|
player, да обратите же вы наконец внимание на то, что пишет Белугин Максим.
Вы же не первый, кто пытался сделать что-то подобное. Через hwnd нельзя получить FormRun, если для этого специально не сохранять ссылку на последнего, запоминая его hwnd |
|
28.10.2007, 13:00 | #8 |
Участник
|
Спасибо.
Уже обратил и усиленно смотрю sources tabax+ TabaxPlugin_RecentWindows (еще раз спасибо ), а Russland отвечал скорее для истории, чтобы те кто будут читать позже не подумали, что этот ответ полностью снимает проблему. |
|
19.01.2009, 16:41 | #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). |
|
|