Показать сообщение отдельно
Старый 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 функцию.
заранее спасибо.