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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.07.2010, 10:53   #1  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Перехват событий на форме DAX 2009
Всем привет!

Стоит задача по подключению внешней OLE компоненты, которая передает данные, генерируя событие WM_COPYDATA

Стал думать, как перехватить. Поднял старые темы, в большинстве которых сам же объяснял, что это невозможно. Однако, в классе FormRun нашел интересный метод:installMessageProc
X++:
public int installMessageProc(int message, int handle, str method)
Без описания, но, в общем, понятно все и так: Событие, Дескриптор окна, Метод. Метод тоже должен быть задан в особом формате:
X++:
void CallbackMethod(int hwnd, int message, int wParam, int lParam, int px, int py)
Проверил - действительно, работает! Создал тестовую форму, в ининте - указал несколько событий, на которые надо реагировать, и два дескриптора: один - на саму форму, второй - на контрол типа Window. А вот потом начинается самое интересное - события она перехватывает, но не все. KEY_DOWN - точно перехватывает.

Стал проверять. А как? Создал клавишу, которая посылает события, используя WinAPI::SendMessage, и, как ни странно, ни на одно из событий даже сама форма - не реагирует. Даже когда посылаешь WM_CLOSE.

Какие будут идеи:
1. Как сгенерировать событие
2. Как сделать так, что бы installMessageProc его перехватил.

Попробуем решить задачу 2003 года?

Форму для проведения экспериментов прилагаю.

Георгий
Вложения
Тип файла: xpo Form_ITB_SendMessageTest.xpo (5.8 Кб, 512 просмотров)
За это сообщение автора поблагодарили: mazzy (2), blokva (1), shogel (1).
Старый 09.07.2010, 12:25   #2  
Кирилл
Гость
 
n/a
Идея будет SendMessageEx поменять на postMesage

По крайней мере форма по нажатию кнопки закрывается, если такую замену произвести.
Остальное тоже должно пойматься.

Последний раз редактировалось Кирилл; 09.07.2010 в 12:33.
За это сообщение автора поблагодарили: George Nordic (5).
Старый 09.07.2010, 16:02   #3  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от George Nordic Посмотреть сообщение
1. Как сгенерировать событие
  • Может не тому окну посылаете (или вообще не то)? (форма состоит из нескольких окон, Воспользуйтесь spy в составе MS VS для контроля)
  • Если посылаете батоном той же формы, возможо, окно "забивает" на WM_CLOSE, т.к. отрабатывает события кнопки (кто знает, как FormRun внутрях (и ещё глебже )сделан).

Цитата:
Сообщение от George Nordic Посмотреть сообщение
2. Как сделать так, что бы installMessageProc его перехватил.

Никак. Опять же, это внутренняя ф-я, и не понятно, какие категории сообщений она перехватывает. Помню, очень долго с ней игрался в рамках создания FormDigger'a

Полноценный переватчик лучше оформить в виде ActiveX - получите полный контроль и читабельный код - но регистрация DLL

Если без регистрации DLL - то придется программить на ASM на X++ для заворачивания процедуры обработки сообщений на себя, что жуть как криво и unsupportable.
Старый 09.07.2010, 18:36   #4  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Может не тому окну посылаете (или вообще не то)? (форма состоит из нескольких окон, Воспользуйтесь spy в составе MS VS для контроля)
Я даже пример приложил Там в инфо выводится инфа, какому окну посылаем сообщение и, если ловит, то его дескриптор.
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Если посылаете батоном той же формы, возможо, окно "забивает" на WM_CLOSE, т.к. отрабатывает события кнопки (кто знает, как FormRun внутрях (и ещё глебже )сделан).
Да, в том-то все и дело. У меня не так много времени было на "поиграться", но вывод пока неутешительный:
1. installMessageProc не раегирует на SendMessage - только на PostMessage
2. Некоторые оповещения (клавиша, фокус, клипбоард) - проходят. А мышь, WM_COPYDATA и некоторые другие - "съедаются" ядром и игнорируются. Что проходит, а что нет - непонятно, описаний нет, только опытным путем.
3. Как видно, съедаются некоторые события, которые можно перекрыть.
4. И наоборот, некоторые события, которые посылаешь "Send/PostMessage" - ловятся, а вот контролы на них не реагируют, хотя, по логике построения мультиоконных интерфейсов, должны.
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Никак. Опять же, это внутренняя ф-я, и не понятно, какие категории сообщений она перехватывает. Помню, очень долго с ней игрался в рамках создания FormDigger'a. Полноценный переватчик лучше оформить в виде ActiveX - получите полный контроль и читабельный код - но регистрация DLL
Да, это и была первоначальная идея. Но случайно наткнулся на этот новый метод (не помнб такого раньше) и решил, что можно попробовать решить стаааренькую задачку.
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Если без регистрации DLL - то придется программить на ASM на X++ для заворачивания процедуры обработки сообщений на себя, что жуть как криво и unsupportable.
Да, но зато будет DAX, в которой реализована возможность перекрытия обработки сообщений

Хотя, помниться, Alex_KD, кажется, когда-то писал что-то подобное.

С Уважением,
Георгий
Старый 09.07.2010, 23:57   #5  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,273 / 3466 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от George Nordic Посмотреть сообщение
Хотя, помниться, Alex_KD, кажется, когда-то писал что-то подобное.
Если ты имеешь в виду AxAssist - то эта тулза с регистрацией DLL
__________________
Возможно сделать все. Вопрос времени
Старый 11.07.2010, 14:34   #6  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Цитата:
Сообщение от George Nordic Посмотреть сообщение
1. installMessageProc не раегирует на SendMessage - только на PostMessage
2. Некоторые оповещения (клавиша, фокус, клипбоард) - проходят. А мышь, WM_COPYDATA и некоторые другие - "съедаются" ядром и игнорируются. Что проходит, а что нет - непонятно, описаний нет, только опытным путем.
При отсылки WM_COPYDATA через postMessage возвращает GetLastError() = 1159 , что расшифровывается как "The message can be used only with synchronous operations".
Другими словами WM_COPYDATA можно отослать только через SendMessage, который installMessageProc игнорирует.

OLE компонент изменить есть возможность? Аксапта отлично реагирует на WM_USER+X сообщения. Так же WM_COMMAND можно попробовать использовать.

Еще некоторые сообщения требуют указатель в параметре lParam вместо int. При отсылки таких сообщение через
X++:
WinApi::postMessage()/WinApi::sendMessage()
Акспта иногда очень быстро умирает.

ЗЫ AxAssist работает в одном треде с Аксаптой и слушает все сообщения до Аксапта, поэтому та м проще что-либо перехватить и обработать.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 11.07.2010, 18:15   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,273 / 3466 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
2 Alex_KD: Так в AxAssist нужна регистрация dll или нет?
__________________
Возможно сделать все. Вопрос времени
Старый 12.07.2010, 15:01   #8  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
2 Alex_KD: Так в AxAssist нужна регистрация dll или нет?
ActiveX надо регестрировать конешно.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 12.07.2010, 19:13   #9  
ddadream is offline
ddadream
Участник
Аватар для ddadream
 
130 / 17 (1) ++
Регистрация: 30.11.2001
Адрес: moscow
Попробуй вот так:

hWnd = this.design().frame();
будет отрабатывать сообщения на самой форме, а не на контроле.

хотя конечно это не поможет.

Последний раз редактировалось ddadream; 12.07.2010 в 19:41.
За это сообщение автора поблагодарили: George Nordic (4).
Старый 30.12.2011, 09:09   #10  
DmitryK is offline
DmitryK
Участник
 
179 / 76 (3) ++++
Регистрация: 22.12.2011
Георгий, формат метода void metod(int hwindow, int message, int wParam, int lParam, int px, int py), если не секрет, вы выяснили из какких источников? По стандарту windows, вроде должно быть достаточно (int hwindow, int message, int wParam, int lParam).

Дмитрий
Старый 17.08.2012, 13:09   #11  
A-Lis-A is offline
A-Lis-A
Участник
 
5 / 10 (1) +
Регистрация: 16.08.2007
А можно ли заставить метод task в SysSetupFormRun ловить что-то кроме того, что предусмотрено стандартом? Например, нажатия клавиш F2, F3, F6...
Старый 17.08.2012, 14:37   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от A-Lis-A Посмотреть сообщение
А можно ли заставить метод task в SysSetupFormRun ловить что-то кроме того, что предусмотрено стандартом? Например, нажатия клавиш F2, F3, F6...
Нет
Перехват клавиш...

Можно через installMessageProc попробовать
Перехват событий на форме DAX 2009
Старый 20.09.2012, 08:58   #13  
DmitryK is offline
DmitryK
Участник
 
179 / 76 (3) ++++
Регистрация: 22.12.2011
Здравствуйте.

Похоже, что данный механизм не работает в 2012 (не перехватываются WM_ CHAR, WM_KEYDOWN). Кто нибудь пробывал? Кто нибудь в курсе почему?

С уважением, Дмитрий.
Старый 20.09.2012, 09:18   #14  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от DmitryK Посмотреть сообщение
Похоже, что данный механизм не работает в 2012 (не перехватываются WM_ CHAR, WM_KEYDOWN).
У вас не перехватываются только эти два события или вообще никакие не перехватываются?

У меня вроде работает. Во вложении пример.
Вложения
Тип файла: xpo Form_TestForm_installMessageProc.xpo (3.0 Кб, 295 просмотров)
За это сообщение автора поблагодарили: DmitryK (1).
Старый 20.09.2012, 11:14   #15  
DmitryK is offline
DmitryK
Участник
 
179 / 76 (3) ++++
Регистрация: 22.12.2011
Да, вы правы Сергей. Спасибо.

С уважением, Дмитрий
Старый 26.03.2014, 14:19   #16  
ShkipeRR is offline
ShkipeRR
Участник
 
41 / 7 (1) +
Регистрация: 08.05.2013
Адрес: Владимир
В данной теме написано всё про 2009, а есть ли для AX 3.0?
Столкнулся с такой ситуацией (Интеграция WiFi ТСД CipherLab с Ax 3.0)
Имеется библиотека CipherLabTCP.dll работа происходит с ней так:
ТСД по Wi-Fi отсылает команду на ПК,которую перехватывает CipherLabTCP.dll. В свою очередь CipherLabTCP.dll посылает сообщение WM_COPYDATA уже конкретному окну и его дескриптору. В принимающем приложении при получении сообщения WM_COPYDATA, следует проверить член Source структуры CopyData. Если он равен "CipherLabTCP", значит это сообщение пришло из терминала.
как в Ax 3.0 реализовать прием WM_COPYDATA и возможно ли реализовать приём сообщения WM_COPYDATA?
__________________
Axapta 3.0 SP6 Build 1951
Старый 29.06.2015, 14:00   #17  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
И снова кнопочки...

Почему пример из первого поста замечательно работает, пока не удаляешь инфолог из init?
__________________
Ax2009
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
DAX 2009 некорректный SPID в форме активных пользователей Logger DAX: Программирование 2 05.07.2010 17:19
emeadaxsupport: List of fixes that improve performance of certain features in Dynamics AX 2009 Blog bot DAX Blogs 0 13.10.2009 19:06
msdynamicsax: DAX 2009 and MS SQL 2008 Blog bot DAX Blogs 0 09.08.2008 14:05
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05
msdynamicsax: Enterprise Portal development in DAX 2009 Blog bot DAX Blogs 0 18.04.2008 07:06
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:43.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.