BEEP — мощная команда в арсенале Microsoft Dynamics NAV

Последние недели я работал над проектом, в котором требовалось использовать команду SendKeys для работы с NAV-клиентом. Во время разработки передо мной встала проблема синхронизации. С одной стороны —  вызовы SendKeys, с другой — поведение непосредственно клиентского приложения. Примерно в таком духе — вы отсылаете NAV’у нажатия клавиш, клиент открывает форму, все это занимает время, а результат — нажатия приняты не тем окном. Я пытался использовать для синхронизации таймер (ожидание, пока окно откроется и т.п.), но это не сработало. Нажатия все равно принимались в очередь событий другого окна.

В один прекрасный день, я захотел отследить, в какой момент срабатывает событие и SendKeys добавляются в очередь обработки. Для этого в событие OnTimer была вставлена команда BEEP(440,100). И представьте себе — все нажатия были отработаны в нужном окне! Я выяснил, что когда вы отсылаете некую последовательность клавиш, которая, к примеру, открывает диалог сохранения файла, надо подождать, пока откроется форма диалога, чтобы «записать» имя файла. BEEP помогает сделать это. Т.к. BEEP вызывает какие-то функции в операционной системе, он каким-то образом передает управление ОС. Если соединить эту особенность с событием OnTimer, можно сделать следующее:

  1. Включить таймер (например, на 100 мс);
  2. При первом срабатывании OnTimer,  передайте нужную последовательность клавиш, которая откроет окно;
  3. После того, как передали клавиши, вызовите BEEP;
  4. В следующий вызов OnTimer передайте вторую последовательность клавиш;
  5. Снова вызовите BEEP после того, как передали клавиши;
  6. Повторите шаги для всех окон и клавиш, которые хотите «нажать»;
  7. В последнем вызове 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.

Добавить комментарий