Определение хэндла текущего окна внешней обработки С# #506979


#0 by HotShot
Написал внешнюю компоненту для 1с. Не получается достучаться до активного окна обработки, которая и юзает компоненту. Ищу хэндл след. образом (C#): Уже третий день бьюсь
#1 by Ковычки
до мди окна (покрайней мере в 77) есть еще одно
#2 by HotShot
проблема в том, что во внешней компоненте подключена библиотека, в которой есть функция в параметрах которой передается хэндл тек. окна, а она выодит свою инормационную форму как чайлд. Указанным выше способом вроде получаю хэндл, передаю его функции, получаю исключение Неопознанная ошибка. Средствами шарпа по this.Handle все работает и форма открывается.
#3 by Rie
Если это внешняя компонента - то она может GetAppMDIFrame (из IExtWndsSupport). И дальше можно попробовать от него.
#4 by H A D G E H O G s
Обратился бы раньше - не парился бы.
#5 by H A D G E H O G s
Счаст
#6 by Рэйв
В вижуал студиях есть хороший тул Spy++ Отлично видно окна.
#7 by Ковычки
нахожу все окна адинес из адинес - дорого
#8 by HotShot
Если это внешняя компонента - то она может GetAppMDIFrame (из IExtWndsSupport)... Вот с этого места поподробнее. IExtWndsSupport - что это?
#9 by HotShot
В вижуал студиях есть хороший тул Spy++... Да штука полезная. Вижу хэндлы, спасибо. Вот как программно все это добыть?
#10 by Rie
Интерфейс 1С, который внешняя компонента может получить в Init.
#11 by HotShot
может получить? а каким образам ее вынудить сделать это? вот: Init([MarshalAs(UnmanagedType.IDispatch)] object _Connection) public void Init([MarshalAs(UnmanagedType.IDispatch)] object p_Connection){ }
#12 by HotShot
то есть в 1C81Data.1С81CObject есть свойство которое можно получить GetAppMDIFrame?
#13 by Rie
Нет, p_Connection - это IDispatch. Из него надо получить IExtWndsSupport, у которого уже есть метод GetAppMDIFrame.
#14 by H A D G E H O G s
Я вот счаст мозг сломал. GetAppMDIFrame возвращает тоже, что и GetAppMainFrame Наверное туплю.
#15 by H A D G E H O G s
Ну да ладно, это - не так важно.
#16 by Rie
Посмотрел на 8.2 - аналогичная ситуация.
#17 by H A D G E H O G s
1) EnumChildWindow от GetAppMainFrame 2) Остановиться, когда наткнемся на класс 'V8MDIClient' 3) Получим AppMDIFrameHandle 3) Найти активное окно обработки через GetWindow(AppMDIFrameHandle,GW_Child)
#18 by HotShot
#19 by H A D G E H O G s
Забей, это не работает в последних версмиях 1С
#20 by H A D G E H O G s
Я бы сделал так. function EnumChildProc(WND:Cardinal;Param:WORD):Boolean;STDCALL; var if UpperCase(String(Buffer))=UpperCase('V8MDIClient') then begin Result:=false; begin if AppMainFrameHandle<>0 then begin end;
#21 by H A D G E H O G s
AppMDIFrameHandle - глобальная переменная, для простоты.
#22 by HotShot
уяяяя... работает. спасибо большое. вопрос напоследок. в 1с тип Handle как то можно описать или это только средствами внешней компоненты?
#23 by HotShot
поясню. я в обработке вызываю функцию компоненты и получаю этот самый handle. в 1с это число. если я это число передаю в другую функцию компоненты, где требуется на вход handle, получаю исключение.
#24 by HotShot
такое очучение что компонениа не понимает что ей 1с дает. сори за не осведомленность.
#25 by H A D G E H O G s
В "другой" функции жди на входе число (Cardinal или Dword, как там у вас). И уже в ней преобразовывай в Handle ваш.
#26 by HotShot
ок. спасибо. очевидно. туплю под вечер =.)
#27 by H A D G E H O G s
Что такого сакрального должна делать ВК?
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С