AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.10.2007, 14:23   #1  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
получить по 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  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
можно только последнюю активизированную форму узнать \Classes\Info\setLastActivatedForm у нее есть hWnd. Только надо учесть, что там хранится слабая ссылка на нее, которую надо хватать, а то по ходу дела исчезнет. См. исходники табакса и \Classes\TabaxPlugin_RecentWindows Ивана Кашперука
За это сообщение автора поблагодарили: player (1).
Старый 26.10.2007, 08:29   #3  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
hwnd у меня как-раз таки есть, мне нужно активировать нужное окно, и поуправлять его контролами... Например, есть массив hwnd окон открытых в системе [1345, 12367, 5674, 11567, 3498, 2345] нужно узнать кто из них "PurchTable", активировать его (это проще всего infolog.activatewindow(hwnd) ) и "поиграть" его контролами, зная их ID.
Старый 26.10.2007, 10:18   #4  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Взято отсюда
text = WinApi::getWindowText(handle);
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню

Последний раз редактировалось Russland; 26.10.2007 в 10:23.
Старый 26.10.2007, 10:19   #5  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
там лежит формран, у него есть hwnd, вы можете по таймеру сканировать окна и запоминать последние активированные и класть их в Map <hWnd --> formRun> после чего его доставать и манипулировать.
Старый 28.10.2007, 07:51   #6  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
Цитата:
Сообщение от Russland Посмотреть сообщение
Взято отсюда
text = WinApi::getWindowText(handle);
Это будет Caption, а не Name в АOT,
Упреждая игры с WinAPI - winapi::getclassname вернет AxMDIChildWindow, и в
getclassinfo тоже ничего полезного вроде нет...
Старый 28.10.2007, 12:31   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
player, да обратите же вы наконец внимание на то, что пишет Белугин Максим.
Вы же не первый, кто пытался сделать что-то подобное.

Через hwnd нельзя получить FormRun, если для этого специально не сохранять ссылку на последнего, запоминая его hwnd
Старый 28.10.2007, 13:00   #8  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
Спасибо.
Уже обратил и усиленно смотрю sources tabax+ TabaxPlugin_RecentWindows (еще раз спасибо ), а Russland отвечал скорее для истории, чтобы те кто будут читать позже не подумали, что этот ответ полностью снимает проблему.
Старый 19.01.2009, 16:41   #9  
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).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как получить мультиселект стандартными средствами!? 3oppo DAX: Программирование 11 29.12.2010 12:50
Как получить указатель на отчёт когда пользователь выбрал Печать на принтер в просмотрщике, в форму SysPrintForm? rkorchagin DAX: Программирование 10 17.04.2008 11:59
Получить значение поля таблицы по номеру (Id) поля Anais DAX: Программирование 2 15.04.2004 13:00
Как получить значение поля Datasource на динамически созданной форме? storer DAX: Программирование 2 14.11.2003 16:41
как получить ссылку на экземпляр времменой таблицы отчета r25 DAX: Программирование 4 14.04.2003 16:34

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:28.