21.02.2013, 13:20 | #1 |
Участник
|
клавиатурный шпион в 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); } но не понял как реализовать callBack функцию. заранее спасибо. |
|
21.02.2013, 14:05 | #2 |
Участник
|
Наиболее эффективно использовать подключение сканера через сом порт. Для этого придется сделать dll опрашивающую сом порт и передающуюю данные в axapta (с# например). В этом случае у вас не будет перечисленных проблем (и тех, которые вы еще не перечислили)
С уважением, Дмитрий. |
|
21.02.2013, 14:19 | #3 |
Участник
|
|
|
21.02.2013, 16:22 | #4 |
Участник
|
Забыл сказать, COM порт не подходит ибо сканер USB и аксапта запущена на терминальном сервере. Поэтому извращаюсь.
To S. Kuskov. разве windows может что-то передать в скрытое поле с невидимым вводом? . Не уверен... |
|
21.02.2013, 16:28 | #5 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: virhundo (1). |
21.02.2013, 16:39 | #6 |
Участник
|
спасибо. попробую и такой вариант.
|
|
18.12.2013, 07:06 | #7 |
Участник
|
Цитата:
|
|
18.12.2013, 08:31 | #8 |
Участник
|
|
|
Теги |
winapi |
|
|