При разработке специализированных интерфейсов, таких как прайс-чекеры, информационные киоски или терминалы самообслуживания, программисты часто сталкиваются с эстетической и технической проблемой: наличием курсора мыши на экране. В условиях, когда управление осуществляется через сканер штрих-кода или сенсорный экран, неподвижная стрелка посередине монитора не только мешает пользователю, но и может привести к «выгоранию» пикселей на старых панелях при длительном простое. В платформе 1С 7.7 штатных средств для полного отключения указателя нет, поэтому мы разберем, как решить эту задачу с помощью внешних инструментов и системных вызовов Windows.
Наиболее простым и стабильным способом в среде 1С 7.7 является использование популярной внешней компоненты Formex. Она обладает методом УстановитьКурсор(), который позволяет подменить стандартный указатель на любой файл формата .cur. Основная сложность здесь заключается в создании «честного» прозрачного курсора, так как обычные графические редакторы часто сохраняют пустые области как видимые серые или белые квадраты.
Разберем процесс создания и подключения прозрачного курсора по шагам:
Cursor и, ничего не рисуя в нем, сохранить файл. Это создаст правильную структуру масок (AND и XOR), которую Windows распознает как полностью прозрачную область.blank.cur) в каталог информационной базы.ПриОткрытии), выполним вызов метода расширения Formex.Пример реализации на языке 1С 7.7:
Процедура ПриОткрытии()
// Создаем объект расширения формы (требуется наличие загруженной ВК Formex)
Сервис = СоздатьОбъект("Сервис");
ПутьККурсору = КаталогИБ() + "blank.cur";
// Устанавливаем прозрачный курсор для текущей формы
Сервис.УстановитьКурсор(ПутьККурсору);
КонецПроцедуры
Важно отметить, что данный метод работает в пределах окна 1С. Если пользователь (или системное событие) выведет указатель за границы формы, он снова станет видимым. Однако для полноэкранных киосков это решение является идеальным.
Если мы не хотим использовать файлы курсоров или нам нужно более жесткое управление на уровне операционной системы, мы можем обратиться к функциям Windows API. Для этого в 1С 7.7 удобно использовать внешнюю компоненту DynamicWrapperX, которая позволяет вызывать любые функции из системных библиотек user32.dll или kernel32.dll.
Рассмотрим функцию ShowCursor. Проанализируем важный нюанс: эта функция работает на основе внутреннего счетчика отображения. Если вы вызываете ее с параметром 0 (скрыть), счетчик уменьшается. Чтобы курсор снова появился, нужно вызвать функцию с параметром 1.
Посмотрим на пример кода для полной деактивации указателя:
// Инициализация объекта для работы с WinAPI
Обертка = СоздатьОбъект("DynamicWrapperX");
Обертка.Register("user32.dll", "ShowCursor", "i=l", "r=l");
// Скрываем курсор (декремент счетчика)
Обертка.ShowCursor(0);
// Для возврата курсора используйте:
// Обертка.ShowCursor(1);
Выясним причину, по которой этот метод может быть неудобен: ShowCursor скрывает указатель только тогда, когда он находится над окнами того потока, который вызвал функцию. Если в системе активно другое приложение, курсор может «проявиться» при наведении на него.
Проанализируем ситуацию, когда нам нужно быстро «убрать» курсор, не вникая в тонкости графических ресурсов. Мы можем программно переместить его в координаты, которые находятся далеко за пределами видимости монитора (например, в точку 10000, 10000). Это можно сделать также через DynamicWrapperX и функцию SetCursorPos.
Обертка = СоздатьОбъект("DynamicWrapperX");
Обертка.Register("user32.dll", "SetCursorPos", "i=ll", "r=l");
// Угоняем курсор далеко вправо и вниз
Обертка.SetCursorPos(10000, 10000);
Хотя этот способ кажется «топорным», он эффективно работает на терминалах, где физически отсутствует мышь, так как исключает случайное появление стрелки при кликах или обновлении экрана. Однако стоит помнить, что при использовании RDP или специфических драйверов «тонких клиентов» (например, WtWare), система может принудительно возвращать курсор в центр экрана при определенных событиях.
Рассмотрим еще один продвинутый метод — использование функции ClipCursor. Эта функция ограничивает движение мыши определенным прямоугольником на экране. Если мы зададим прямоугольник размером 1x1 пиксель где-нибудь в невидимой области, мышь фактически будет «заблокирована» в этой точке.
Для реализации этого метода потребуется передать структуру RECT (4 целых числа: Left, Top, Right, Bottom). Это более надежно, чем простое перемещение, так как операционная система будет игнорировать попытки переместить мышь за пределы указанного пикселя до тех пор, пока ограничение не будет снято.
Разберем специфику работы прайс-чекеров через удаленный рабочий стол. При использовании Windows Server 2003 или более новых версий через RDP, отрисовка курсора часто ложится на плечи клиента (например, терминала на Linux или WtWare).
Важные рекомендации:
Formex, сервер честно отправляет прозрачную картинку клиенту. Это наиболее стабильный вариант для RDP-сессий, так как он не конфликтует с механизмами синхронизации координат мыши между сервером и клиентом.В завершение подчеркнем: выбор метода зависит от архитектуры вашего решения. Если вы уже используете Formex для расширения возможностей интерфейса (что в 1С 7.7 является стандартом де-факто), то использование прозрачного .cur файла будет самым быстрым и предсказуемым решением. Если же вы стремитесь к минимализму без лишних файлов в каталоге базы, то прямой вызов ShowCursor через DynamicWrapperX обеспечит вам необходимый контроль.