FAQ по Visual Basic

Содержание / Windows API Поиск | Далее

§ 5.7. Создание консольного приложения

Известно, что VB заточен под создание графического пользовательского интерфейса, и стандартных функций работы с консолью там вообще нет. Но нам это не преграда. ;-) Создать консольное приложение можно и через Windows API. Пример (вместе с модулем-помощником) лежит в архиве Console.

Некоторые важные тонкости.

  1. Консольное приложение может быть перенаправлено (см. также § 5.20. Перенаправление ввода и вывода программы), и с этим необходимо считаться. Если вы крутите бесконечный цикл, ожидая действие пользователя (нажатие кнопки или клик мыши), то он будет действительно бесконечным. Чтобы определить, ссылается ли стандартный хендл на консоль или нет (т. е. перенаправлен ли он), служит свойство IsConsole.
  2. Чтобы работать с мышью и отдельными нажатиями клавиш, вам необходимо создать диспетчер сообщений. Диспетчер сообщений — это бесконечный цикл, который сначала ожидает сообщение (функция WaitForEvent), а потом обрабатывает его. Извлечь сообщения из очереди можно с помощью функций ReadKey, ReadMouse, ReadWindowResize, причем каждая из них читает только свой тип сообщений, игнорируя все остальные типы. Если же сообщений в очереди нет, то каждая из этих трех функций замораживает программу, ожидая их появления. Это может быть не очень удобно при отладке программы, поэтому ожидать сообщения нужно с помощью WaitForEvent. (См. также § 5.19. Как сделать задержку в программе?)
  3. Когда пользователь или система пытаются прервать работу программы, то это требование передается обработчику управляющих событий. Но (это очень важно!) он вызывается в другом потоке и поэтому неработоспособен. В моем варианте в качестве такого обработчика работает маленькая программка на ассемблере, но вы можете написать его и на VB — с соблюдением всех мер предосторожности. (См. также § 7.2. Как создать многопоточное приложение?)
  4. При срабатывании обработчика управляющих событий свойство HasBreak устанавливается в True, а свойство BreakMode возвращает подробности о том, кто и как решил завершить работу программы. Чтобы поймать этот момент и корректно завершить работу программы до того, как пользователь нажмет “End Now”, нужно в обработчике событий постоянно проверять свойство HasBreak. В случае обнаружения прерывания нужно срочно прервать все действия, закрыть консоль методом TerminateConsole и завершить работу программы.

  5. В модуле, который использован в примере к этой статье, не реализована работа с несколькими буферами вывода, а также еще некоторые функции, например, прокрутка буфера и изменение его размера. Если хотите, можете это сделать сами.
  6. Консоль может быть создана и GUI'шным приложением, но если его запустить из командной строки, то будет создано новое консольное окно, что, согласитесь, не совсем правильно. Избежать этого можно, сменив тип нашего приложения с GUI на Character. Это можно сделать с помощью программки MakeCon, которая также лежит в архиве с примером. Любопытно, что даже имея тип Character, приложение может отображать свои окошки, например, MsgBox.

Автор:
Master

Предыдущий раздел Следующий раздел

© 2004. При цитировании, пожалуйста, не забудьте поставить ссылку на оригинальную страницу.