27 February 2012

Простой индикатор раскладки клавиатуры в курсоре на С++

C++System Programming
Тема отображения текущей раскладки беспокоила хабрасообщество уже не раз. Я опробовал множество существующих решений, но по разным причинам они меня не устроили. Чтобы подобрать для себя наиболее удобный вариант отображения текущей раскладки, я написал небольшое приложение на C++, которое при нажатии на левый Shift отображает язык в системном курсоре редактирования текста. Менее 100 строк кода и около 4 килобайт в скомпилированном виде — на основе этого вы можете достаточно просто реализовать свой взгляд на то, как на самом деле должна выглядеть индикация текущей раскладки.

Как это сделано?


Поскольку ничего кроме WinAPI нам не нужно, программа компилируется без RTL в Visual Studio 2010. Таким образом мы получаем очень маленький объём исполняемого файла. Для отслеживания нажатия на Shift устанавливается клавиатурный хук без использования dll. Для изменения системного курсора редактирования текста используется функция SetSystemCursor — она позволяет заменить необходимый тип стандартного курсора сразу во всех приложениях. Таким образом мы избегаем необходимости тратить дополнительные ресурсы на отображение индикатора на экране — этим занимается сама система. По умолчанию курсор редактирования текста без тени и инвертирует цвет каждого пикселя под собой. Такое возможно только в двухцветных курсорах, поэтому чтобы сохранить это полезное свойство, мы должны сделать наш индикатор чёрно-белым.

Где можно скачать результат?


Исходный код можно увидеть в файле main.cpp (на bitbucket.org) или скачать в виде проекта langcursor-1.0-src.zip (5 кб). Внимание! Проект компилируется только в Release-версии (из-за отсутствия RTL).
Готовый исполняемый файл в архиве: langcursor-1.0-bin.zip (1 кб).

Что я могу изменить?


Если вы хотите добавить отображение других раскладок, достаточно добавить ресурс курсора с идентификатором раскладки в качестве имени (можно задать в файле resource.h, значение из последней колонки таблицы идентификаторов языков). Если вам не нравится маленькая чёрно-белая индикация языка, вы можете заменить курсоры на свои, например, с цветными флагами. Однако, при использовании цветных курсоров вы не сможете добиться инвертирования цветов под курсором и курсор начнёт отбрасывать тень (если её не выключить в настройках).
Более того, если вы знакомы с C/С++, вы можете полностью изменить код под себя! Пробуйте, экспериментируйте, делитесь вашими наработками! Все люди разные, что подходит одним — не факт, что подойдёт другим. Но вместе мы, надеюсь, сможем придумать наиболее удобное решение :)

Модифицированные версии


Постоянное отображение иконки языка без необходимости нажимать Shift здесь.
Версия с постоянным отображением и поддержкой украинского языка здесь.
Tags:юзабилитииндикатор раскладкираскладка клавиатуры
Hubs: C++ System Programming
+70
29.7k 300
Comments 74
C++ Developer. Professional
December 28, 202060,000 ₽OTUS
Программирование на языке C (Си)
December 14, 202022,990 ₽Специалист.ру
C++ Junior Developer
March 3, 202123,990 ₽Level UP
Профессия iOS-разработчик
November 30, 202075,000 ₽SkillFactory
Top of the last 24 hours