Как полностью убрать или скрыть курсор мыши на форме в 1С:Предприятие 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке специализированных интерфейсов, таких как прайс-чекеры, информационные киоски или терминалы самообслуживания, программисты часто сталкиваются с эстетической и технической проблемой: наличием курсора мыши на экране. В условиях, когда управление осуществляется через сканер штрих-кода или сенсорный экран, неподвижная стрелка посередине монитора не только мешает пользователю, но и может привести к «выгоранию» пикселей на старых панелях при длительном простое. В платформе 1С 7.7 штатных средств для полного отключения указателя нет, поэтому мы разберем, как решить эту задачу с помощью внешних инструментов и системных вызовов Windows.

Метод 1: Использование прозрачного курсора через ВК Formex

Наиболее простым и стабильным способом в среде 1С 7.7 является использование популярной внешней компоненты Formex. Она обладает методом УстановитьКурсор(), который позволяет подменить стандартный указатель на любой файл формата .cur. Основная сложность здесь заключается в создании «честного» прозрачного курсора, так как обычные графические редакторы часто сохраняют пустые области как видимые серые или белые квадраты.

Разберем процесс создания и подключения прозрачного курсора по шагам:

  1. Рассмотрим создание файла курсора. Для этого лучше всего использовать специализированные утилиты, такие как Pelles C или другие редакторы ресурсов. В таких программах достаточно создать новый объект типа Cursor и, ничего не рисуя в нем, сохранить файл. Это создаст правильную структуру масок (AND и XOR), которую Windows распознает как полностью прозрачную область.
  2. Поместим полученный файл (например, blank.cur) в каталог информационной базы.
  3. В коде формы, где необходимо скрыть курсор (например, в процедуре ПриОткрытии), выполним вызов метода расширения Formex.

Пример реализации на языке 1С 7.7:


Процедура ПриОткрытии()
    // Создаем объект расширения формы (требуется наличие загруженной ВК Formex)
    Сервис = СоздатьОбъект("Сервис");
    ПутьККурсору = КаталогИБ() + "blank.cur";
    
    // Устанавливаем прозрачный курсор для текущей формы
    Сервис.УстановитьКурсор(ПутьККурсору);
КонецПроцедуры

Важно отметить, что данный метод работает в пределах окна 1С. Если пользователь (или системное событие) выведет указатель за границы формы, он снова станет видимым. Однако для полноэкранных киосков это решение является идеальным.

Метод 2: Программное скрытие через WinAPI и DynamicWrapperX

Если мы не хотим использовать файлы курсоров или нам нужно более жесткое управление на уровне операционной системы, мы можем обратиться к функциям 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 скрывает указатель только тогда, когда он находится над окнами того потока, который вызвал функцию. Если в системе активно другое приложение, курсор может «проявиться» при наведении на него.

Метод 3: Принудительное перемещение курсора за границы экрана

Проанализируем ситуацию, когда нам нужно быстро «убрать» курсор, не вникая в тонкости графических ресурсов. Мы можем программно переместить его в координаты, которые находятся далеко за пределами видимости монитора (например, в точку 10000, 10000). Это можно сделать также через DynamicWrapperX и функцию SetCursorPos.


Обертка = СоздатьОбъект("DynamicWrapperX");
Обертка.Register("user32.dll", "SetCursorPos", "i=ll", "r=l");

// Угоняем курсор далеко вправо и вниз
Обертка.SetCursorPos(10000, 10000);

Хотя этот способ кажется «топорным», он эффективно работает на терминалах, где физически отсутствует мышь, так как исключает случайное появление стрелки при кликах или обновлении экрана. Однако стоит помнить, что при использовании RDP или специфических драйверов «тонких клиентов» (например, WtWare), система может принудительно возвращать курсор в центр экрана при определенных событиях.

Метод 4: Ограничение области перемещения (ClipCursor)

Рассмотрим еще один продвинутый метод — использование функции ClipCursor. Эта функция ограничивает движение мыши определенным прямоугольником на экране. Если мы зададим прямоугольник размером 1x1 пиксель где-нибудь в невидимой области, мышь фактически будет «заблокирована» в этой точке.

Для реализации этого метода потребуется передать структуру RECT (4 целых числа: Left, Top, Right, Bottom). Это более надежно, чем простое перемещение, так как операционная система будет игнорировать попытки переместить мышь за пределы указанного пикселя до тех пор, пока ограничение не будет снято.

Технические нюансы работы в терминальном режиме (RDP)

Разберем специфику работы прайс-чекеров через удаленный рабочий стол. При использовании Windows Server 2003 или более новых версий через RDP, отрисовка курсора часто ложится на плечи клиента (например, терминала на Linux или WtWare).

Важные рекомендации:

  1. Если на терминале нет мыши, убедитесь, что в настройках клиента не включена эмуляция указателя.
  2. При использовании прозрачного курсора через Formex, сервер честно отправляет прозрачную картинку клиенту. Это наиболее стабильный вариант для RDP-сессий, так как он не конфликтует с механизмами синхронизации координат мыши между сервером и клиентом.
  3. Помните о «хранителе экрана». Как было замечено в обсуждении, если ваша 1С-форма работает как заставка (например, плавающий текст или картинка), скрытие курсора критически важно для предотвращения эффекта «выгорания» люминофора или деградации пикселей ЖК-панели в одной точке.

В завершение подчеркнем: выбор метода зависит от архитектуры вашего решения. Если вы уже используете Formex для расширения возможностей интерфейса (что в 1С 7.7 является стандартом де-факто), то использование прозрачного .cur файла будет самым быстрым и предсказуемым решением. Если же вы стремитесь к минимализму без лишних файлов в каталоге базы, то прямой вызов ShowCursor через DynamicWrapperX обеспечит вам необходимый контроль.

← На главную