09.07.2010, 10:53 | #1 |
Модератор
|
Перехват событий на форме 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) Стал проверять. А как? Создал клавишу, которая посылает события, используя WinAPI::SendMessage, и, как ни странно, ни на одно из событий даже сама форма - не реагирует. Даже когда посылаешь WM_CLOSE. Какие будут идеи: 1. Как сгенерировать событие 2. Как сделать так, что бы installMessageProc его перехватил. Попробуем решить задачу 2003 года? Форму для проведения экспериментов прилагаю. Георгий |
|
|
За это сообщение автора поблагодарили: mazzy (2), blokva (1), shogel (1). |
09.07.2010, 12:25 | #2 |
Гость
|
Идея будет SendMessageEx поменять на postMesage
По крайней мере форма по нажатию кнопки закрывается, если такую замену произвести. Остальное тоже должно пойматься. Последний раз редактировалось Кирилл; 09.07.2010 в 12:33. |
|
|
За это сообщение автора поблагодарили: George Nordic (5). |
09.07.2010, 16:02 | #3 |
Боец
|
Никак. Опять же, это внутренняя ф-я, и не понятно, какие категории сообщений она перехватывает. Помню, очень долго с ней игрался в рамках создания FormDigger'a Полноценный переватчик лучше оформить в виде ActiveX - получите полный контроль и читабельный код - но регистрация DLL Если без регистрации DLL - то придется программить на ASM на X++ для заворачивания процедуры обработки сообщений на себя, что жуть как криво и unsupportable. |
|
09.07.2010, 18:36 | #4 |
Модератор
|
Цитата:
Цитата:
1. installMessageProc не раегирует на SendMessage - только на PostMessage 2. Некоторые оповещения (клавиша, фокус, клипбоард) - проходят. А мышь, WM_COPYDATA и некоторые другие - "съедаются" ядром и игнорируются. Что проходит, а что нет - непонятно, описаний нет, только опытным путем. 3. Как видно, съедаются некоторые события, которые можно перекрыть. 4. И наоборот, некоторые события, которые посылаешь "Send/PostMessage" - ловятся, а вот контролы на них не реагируют, хотя, по логике построения мультиоконных интерфейсов, должны. Цитата:
Цитата:
Хотя, помниться, Alex_KD, кажется, когда-то писал что-то подобное. С Уважением, Георгий |
|
09.07.2010, 23:57 | #5 |
Administrator
|
Если ты имеешь в виду AxAssist - то эта тулза с регистрацией DLL
__________________
Возможно сделать все. Вопрос времени |
|
11.07.2010, 14:34 | #6 |
Участник
|
Цитата:
Сообщение от George Nordic
1. installMessageProc не раегирует на SendMessage - только на PostMessage
2. Некоторые оповещения (клавиша, фокус, клипбоард) - проходят. А мышь, WM_COPYDATA и некоторые другие - "съедаются" ядром и игнорируются. Что проходит, а что нет - непонятно, описаний нет, только опытным путем. Другими словами 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 |
Administrator
|
2 Alex_KD: Так в AxAssist нужна регистрация dll или нет?
__________________
Возможно сделать все. Вопрос времени |
|
12.07.2010, 15:01 | #8 |
Участник
|
ActiveX надо регестрировать конешно.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
12.07.2010, 19:13 | #9 |
Участник
|
Попробуй вот так:
hWnd = this.design().frame(); будет отрабатывать сообщения на самой форме, а не на контроле. хотя конечно это не поможет. Последний раз редактировалось ddadream; 12.07.2010 в 19:41. |
|
|
За это сообщение автора поблагодарили: George Nordic (4). |
30.12.2011, 09:09 | #10 |
Участник
|
Георгий, формат метода 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 |
Участник
|
А можно ли заставить метод task в SysSetupFormRun ловить что-то кроме того, что предусмотрено стандартом? Например, нажатия клавиш F2, F3, F6...
|
|
17.08.2012, 14:37 | #12 |
Участник
|
Цитата:
Перехват клавиш... Можно через installMessageProc попробовать Перехват событий на форме DAX 2009 |
|
20.09.2012, 08:58 | #13 |
Участник
|
Здравствуйте.
Похоже, что данный механизм не работает в 2012 (не перехватываются WM_ CHAR, WM_KEYDOWN). Кто нибудь пробывал? Кто нибудь в курсе почему? С уважением, Дмитрий. |
|
20.09.2012, 09:18 | #14 |
Участник
|
Цитата:
У меня вроде работает. Во вложении пример. |
|
|
За это сообщение автора поблагодарили: DmitryK (1). |
20.09.2012, 11:14 | #15 |
Участник
|
Да, вы правы Сергей. Спасибо.
С уважением, Дмитрий |
|
26.03.2014, 14:19 | #16 |
Участник
|
В данной теме написано всё про 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 |
Участник
|
И снова кнопочки...
Почему пример из первого поста замечательно работает, пока не удаляешь инфолог из init?
__________________
Ax2009 |
|
|
|