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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.02.2013, 13:20   #1  
virhundo is offline
virhundo
Участник
 
33 / 16 (1) ++
Регистрация: 29.03.2007
клавиатурный шпион в Ax 3.0 )))
Добрый день!
Пытаюсь перехватить сообщения от сканера подключенного в разрыв клавиатуры. Простым путем не могу пойти так как форма на которой вводят штрихкоды может не иметь активных текстовых полей. завязываться на фокус тоже нельзя, открывать форму поиска или форму с активным текстовым полем (реакция на преффикс сканера) тоже не желательно. Сейчас использую peekMessage c setTimeout("processMessage",1) , но все равно не успеваю обработать всю очередь, часть отсканированногог штрихкода просто теряется. Может кто-то работал с очередью сообщение в Axapta 3.0? Как выбрать все необработанные сообщения за одну итерацию?
Код класса, который вызываю из run() формы:
X++:
protected void initDll()
{
     winApiDLL       = new DLL('USER32');
      user32Handle   = this.LoadLibrary('USER32');
      getMessage      = new DLLFunction(winApiDLL, 'GetMessageA');
      peekMessage     = new DLLFunction(winApiDLL, 'PeekMessageA');
      TranslateMessage= new DLLFunction(winApiDLL, 'TranslateMessage');
      dispatchMessage = new DLLFunction(winApiDLL, 'DispatchMessageA');
      TranslateMessage.arg(ExtTypes::Pointer);
      TranslateMessage.returns(ExtTypes::DWORD);
      getMessage.arg(ExtTypes::POINTER, ExtTypes::DWORD, ExtTypes::DWORD, ExtTypes::DWORD);
      getMessage.returns(ExtTypes::DWord);
      peekMessage.arg(ExtTypes::POINTER, ExtTypes::DWORD, ExtTypes::DWORD, ExtTypes::DWORD, ExtTypes::DWORD);
      peekMessage.returns(ExtTypes::DWord);
      dispatchMessage.arg(ExtTypes::Pointer);
      dispatchMessage.returns(ExtTypes::DWORD);
}
сам метод обработчик

X++:
 #define.messageBinary_30(30)
#define.messageBinary_8(8)
#define.messageBinary_4(4)
#define.messageBinary_12(12)
#define.PM_NOREMOVE(0x0000)
#define.PM_REMOVE(0x0001)
#define.PM_NOYIELD(0x0002)
#define.WM_KEYFIRST(256)
#define.WM_KEYLAST(264)
#define.WM_QUIT(0x0012)
#WINAPI
void ProcessMessages()
{
    Binary               message      = new Binary(#messageBinary_30);
    str                  keyValue;
    int                  peekFlag,  mdiClient, i;
    int                  peekMsg;
    ;
         queueDone = false;
           while(!queueDone)
           {
               while(peekMessage.call(message,0,0,0,#PM_REMOVE))
               {
                   peekMsg = message.dWord(#messageBinary_4);
                   switch(peekMsg)
                   {
                       //case #WM_keyDown :
                       case #WM_Char :
                         keyValue = message.String(#messageBinary_8);
                         keyStr += keyValue;
                         keyStr = strrem(keyStr,"\r\n\t");
                         queueDone = true;
                       break;
                   }
                     if(TranslateMessage.call(message))
                        dispatchMessage.call(message);
                   else dispatchMessage.call(message);
 
               }
 
  if(char2num(keyValue,1)==13) { info(keyStr); keyStr="";}
 
}
в цикле
X++:
protected void InternalLoop()
{
 this.ProcessMessages();
 iTimer =this.setTimeOut('Internalloop',1);
}
C хуками пытался разобраться , по примеру http://www.trucosax.com/phpnuke/modu...iewtopic&t=711
но не понял как реализовать callBack функцию.
заранее спасибо.
Старый 21.02.2013, 14:05   #2  
DmitryK is offline
DmitryK
Участник
 
179 / 76 (3) ++++
Регистрация: 22.12.2011
Наиболее эффективно использовать подключение сканера через сом порт. Для этого придется сделать dll опрашивающую сом порт и передающуюю данные в axapta (с# например). В этом случае у вас не будет перечисленных проблем (и тех, которые вы еще не перечислили)

С уважением, Дмитрий.
Старый 21.02.2013, 14:19   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от virhundo Посмотреть сообщение
открывать форму с активным текстовым полем не желательно
А если не новую форму открывать, а на существующей форме временно перепозиционироваться на скрытый контрол?
Старый 21.02.2013, 16:22   #4  
virhundo is offline
virhundo
Участник
 
33 / 16 (1) ++
Регистрация: 29.03.2007
Забыл сказать, COM порт не подходит ибо сканер USB и аксапта запущена на терминальном сервере. Поэтому извращаюсь.

To S. Kuskov. разве windows может что-то передать в скрытое поле с невидимым вводом? . Не уверен...
Старый 21.02.2013, 16:28   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от virhundo Посмотреть сообщение
To S. Kuskov. разве windows может что-то передать в скрытое поле с невидимым вводом? . Не уверен...
Скрывать можно по разному. У нас такой служебный контрол находится в группе, у которой выставленна нулевая высота Всё передаётся...
За это сообщение автора поблагодарили: virhundo (1).
Старый 21.02.2013, 16:39   #6  
virhundo is offline
virhundo
Участник
 
33 / 16 (1) ++
Регистрация: 29.03.2007
спасибо. попробую и такой вариант.
Старый 18.12.2013, 07:06   #7  
Maksim is offline
Maksim
Участник
Axapta Retail User
Ex AND Project
 
25 / 18 (1) ++
Регистрация: 28.03.2003
Адрес: г. Владивосток
Цитата:
Сообщение от DmitryK Посмотреть сообщение
Наиболее эффективно использовать подключение сканера через сом порт. Для этого придется сделать dll опрашивающую сом порт и передающуюю данные в axapta (с# например). В этом случае у вас не будет перечисленных проблем (и тех, которые вы еще не перечислили)

С уважением, Дмитрий.
Тогда возникает вопрос как передать данные в активное окно аксапты, если ее запущено несколько экземпляров? В аксаптовском COM нет возможности получить список запущенных аксапт, насколько я понимаю.
Старый 18.12.2013, 08:31   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Maksim Посмотреть сообщение
В аксаптовском COM нет возможности получить список запущенных аксапт, насколько я понимаю.
А у клиента аксапты вообще есть COM интерфейс?
Теги
winapi

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
amer-ax: It was a great day! Blog bot DAX Blogs 3 29.12.2012 01:02
DAX: Official Dynamics AX 2012 R2 Content (update) - Where is it, and how can you find out about updates? Blog bot DAX Blogs 0 03.12.2012 11:11
emeadaxsupport: New Content for Microsoft Dynamics AX 2012 : October 2011 Blog bot DAX Blogs 0 27.10.2011 17:11
axinthefield: Dynamics AX Event IDs Blog bot DAX Blogs 0 01.03.2011 22:11
daxdilip: Whats New in Dynamics AX 2012 (A brief extract from the recently held Tech Conf.) Blog bot DAX Blogs 7 31.01.2011 12:35
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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