Добрый день!
Пытаюсь перехватить сообщения от сканера подключенного в разрыв клавиатуры. Простым путем не могу пойти так как форма на которой вводят штрихкоды может не иметь активных текстовых полей. завязываться на фокус тоже нельзя, открывать форму поиска или форму с активным текстовым полем (реакция на преффикс сканера) тоже не желательно. Сейчас использую 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 функцию.
заранее спасибо.