BEEP — мощная команда в арсенале Microsoft Dynamics NAV
Последние недели я работал над проектом, в котором требовалось использовать команду SendKeys для работы с NAV-клиентом. Во время разработки передо мной встала проблема синхронизации. С одной стороны — вызовы SendKeys, с другой — поведение непосредственно клиентского приложения. Примерно в таком духе — вы отсылаете NAV’у нажатия клавиш, клиент открывает форму, все это занимает время, а результат — нажатия приняты не тем окном. Я пытался использовать для синхронизации таймер (ожидание, пока окно откроется и т.п.), но это не сработало. Нажатия все равно принимались в очередь событий другого окна.
В один прекрасный день, я захотел отследить, в какой момент срабатывает событие и SendKeys добавляются в очередь обработки. Для этого в событие OnTimer была вставлена команда BEEP(440,100). И представьте себе — все нажатия были отработаны в нужном окне! Я выяснил, что когда вы отсылаете некую последовательность клавиш, которая, к примеру, открывает диалог сохранения файла, надо подождать, пока откроется форма диалога, чтобы «записать» имя файла. BEEP помогает сделать это. Т.к. BEEP вызывает какие-то функции в операционной системе, он каким-то образом передает управление ОС. Если соединить эту особенность с событием OnTimer, можно сделать следующее:
- Включить таймер (например, на 100 мс);
- При первом срабатывании OnTimer, передайте нужную последовательность клавиш, которая откроет окно;
- После того, как передали клавиши, вызовите BEEP;
- В следующий вызов OnTimer передайте вторую последовательность клавиш;
- Снова вызовите BEEP после того, как передали клавиши;
- Повторите шаги для всех окон и клавиш, которые хотите «нажать»;
- В последнем вызове OnTime, выключите таймер.
Использование BEEP гарантирует, что каждая последовательность нажатий клавиш будет передана в нужное окно, если BEEP вызывается сразу после SendKeys, а NAV свободен для обработки следующей команды. Если вы сделаете это без BEEP, клавиши будут переданы «слишком быстро», и возможно, переданы в ненужное окно.
Естественно, вы не хотите каждый раз слышать би-би, поэтому поставьте частоту в 1 Гц (0 Гц не работает, идет просто пропуск вызова команды). Я выяснил, что время выполнения BEEP должно быть больше 10мс, иначе эффекта не будет. Впрочем, как я понимаю, это зависит еще и от самой машины.
Зная это, можно вытворять удивительные вещи (например, автоматический контроль версий) :)
Вот такие у моего исследования результаты. Не знаю, почему оно так работает, но знайте — ЭТО РАБОТАЕТ (по крайней мере, у меня и моих коллег)
Проверено на 4.00 SP2 и 5.0.
Развлекайтесь с новым мощным BEEP’ом!
Оригинал статьи находится здесь — «Powerfull Command in Microsoft Dynamics NAV«

Автор: Андрей Стрельников
В области Navision - с 2003 года. Профессиональные интересы: NAV, MS SQL, .NET, BPMN, IT-менеджмент. Предметная область: логистика, финансы, склады, 3PL.
Количество статей, опубликованных автором: 86.