Pull to refresh

Comments 74

Чтобы использовать некоторые удобные возможности C++, которые доступны при отключении RTL.
Вынесли бы куда-нибудь повыше, что это решение Windows-only? А то первая видимая строчка про WinAPI (которая наводит на такие мысли) — под катом…
Скриншот для лого сделан в Windows 7, мне кажется очертания курсора узнаваемы :)

для того чтобы они были бы узнаваемы — человек (который должен узнать) должен был бы использовать Windows (и приглядываться к курсору).


А это делают, всё же, далеко не все.

А почему бы и нет? И кто же, если не он? :)
Сразу в заголовке было написано просто C, я позже исправил на C++ — чтобы было понятно, что означает этот комментарий.
Win7 Ult SP1 x64 RUS. Щито-то не арбайтен. В процессах висит, толку ноль. Не в редакторах, ни в эксплорере винды.
У меня Windows 7 SP Professional (английская, x86), плюс тестировал на Windows XP — работало. Вы нажимаете Shift, когда курсор находится над полем для ввода? Дело в том, что индикация появляется только по нажатию на Shift. Я это сделал для того, чтобы в браузере при чтении текста индикация не отображалась на этом же курсоре.
у меня Win7 Ult x86 Rus — работает. Наверно дело в x64…
Кстати, довольно удобно. Спасибо за программку
Почему-то подумалось, что будет реагировать на alt + shift / ctrl + shift. Так что звиняйте ради Бога.

Имхо, не совсем удобно для проверки нажимать лишний раз шифт. Понятно, что привыкнуть можно, но все же, было бы лучше отслеживать системное изменение курсора со стандартного на «I» и тут уже на постоянку подсовывать отображение идентификатора текущей раскладки. Но это так, мысли в слух.
UFO just landed and posted this here
Соглашусь с тем, что постоянно отображать — удобнее.
А тем, кто в силу каких-то причин не пользуется мышкой, было бы удобно отображать прямо в поле ввода.
Можно добавить иконку в трей и настройки
Ниже в комментариях есть реализация подобного поведения.
Как вариант можно генерировать изображение курсора при запуске программы для разных раскладок и хранить их в памяти.

Реализовать, думаю можно через сплайсиг SetCursor, но возможно есть получше вариант.
WinXP x86 Работает отлично. Спасибо за маленькую полезную программку, которая вовсе не мешает.
Чтобы язык постоянно отображался рядом с курсором курсором редактирования текста, достаточно просто убрать хук на клавиатуру и запустить таймер без ограничений по времени. Кода получится ещё меньше.
#define OEMRESOURCE
#include <windows.h>

HINSTANCE   g_instance;
HCURSOR     g_hc_ibeam;
UINT_PTR    g_timer = NULL;
DWORD       g_layout = 0;

void CALLBACK UpdateTimer(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
    int layout = (int) GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL)) & 0xFFFF;
    if (g_layout != layout)
    {
        HCURSOR hc_new = LoadCursor(g_instance, MAKEINTRESOURCE(layout));
        if (hc_new)
        {
            SetSystemCursor(hc_new, OCR_IBEAM);
        }
        else
        {
            SetSystemCursor(CopyCursor(g_hc_ibeam), OCR_IBEAM);
        }
    }
}

int Main()
{
    HANDLE mutex = CreateMutex(NULL, FALSE, "LangCursor");
    if (GetLastError() == ERROR_ALREADY_EXISTS || GetLastError() == ERROR_ACCESS_DENIED) return 1;

    g_hc_ibeam = CopyCursor(LoadCursor(NULL, IDC_IBEAM));
    if (!g_hc_ibeam) return 1;

    g_instance = GetModuleHandle(NULL);
    g_timer = SetTimer(NULL, g_timer, 200, UpdateTimer);
    if (!g_timer) return 1;

    MSG msg;
    while (GetMessage(&msg,0,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    DestroyCursor(g_hc_ibeam);
    return 0;
}

EXTERN_C void WINAPI WinMainCRTStartup()
{
    ExitProcess(Main());
}

Правда это не очень красивое решение. Более грамотно было бы внедрять во все процессы dll, которая отлавливала бы событие изменения языка в приложении и меняла соответствующим образом курсор. Заметка на будущее.
UFO just landed and posted this here
А будьте любезны, скомпилируйте для трех языков: английский, русский, украинский.

PS: VEG, спасибо за отличную утилиту!
После
    if (g_layout != layout)
    {
забыл строчку
        g_layout = layout;
Из-за этой ошибки курсор устанавливается даже тогда, когда это не нужно. В архиве уже исправленная версия.
А зачем внедряться во все процессы? Может быть проще и не менее грамотно ставить хук на WH_SHELL, событие HSHELL_LANGUAGE?
Сам не пробовал, но мне кажется, что должно работать как следует.
К сожалению, не удалось найти внятной документации об этом на MSDN. Судя по этому обсуждению событие HSHELL_LANGUAGE можно отловить только для своего процесса. Хотя это необходимо проверить.
А для linux(ubuntu) есть аналогичное решение?
Ну что, написать что ли? Какой оболочкой пользуемся?
Если это не в напряг, было бы шикарно. Unity
Обещать ничего не могу: в первую очередь мне просто интересно разобраться с аналогичной темой. Если выйдет что-то интересное — поделюсь.
Еще бы как-то сделать, чтобы для каждой закладки хрома сохранялась раскладка ;)
Отличное дополнение к capswitch.
UFO just landed and posted this here
Перед этим вы запускали перманентную версию? Если да, то после её убийства до перезагрузки остаётся курсор с последним языком, и обычная версия использует этот курсор как основной. Чтобы сбросить без перезагрузки, зайдите в настройки курсоров мыши и обновите там курсор редактирования текста сперва на какой-нибудь левый, затем опять на стандартный.
UFO just landed and posted this here
Программа при загрузке запоминает текущий системный курсор, при изменении языка она его подменяет, и если в этот момент убить программу, то системный курсор останется подменённым на версию с иконкой языка.
Если вы пытаетесь выбрать язык, для которого нет курсора (а курсор сейчас есть только для русского и для английского), то программа отображает стандартный курсор, который она сохранила при загрузке.
Для нормальной работы после убийства программы нужно сперва сбросить курсор на нормальный, и только после этого запускать новый экземпляр.
Чтобы этого избежать, нужно будет реализовать нормальную процедуру выхода, когда курсор восстанавливался бы сам. В ближайшем обновлении реализуем.
UFO just landed and posted this here
UFO just landed and posted this here
К сожалению, не знаю с чем может быть связана эта проблема :( Попробуйте добавить такой ключ в реестр и перезагрузиться (должно отключить сервисы для восточноазиатских языков).
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IMM]
"LoadIMM"=dword:00000000
UFO just landed and posted this here
Рядом с мышиным курсором что-то показывать не очень практично, он может быть где угодно во время ввода текста, а может быть даже скрыт (некоторые программы умеют его прятать когда начинается набор текста). Я когда-то пробовал возле каретки эту информацию выводить, но к сожалению многие приложения не используют стандартную каретку (например тот же офис или приложения на Qt) и как в них вклиниваться осталось для меня непонятным.
В среде, где достаточно RU+EN+Compose, достаточно прицепить переключение раскладки, скажем, на CapsLock, и по светодиоду на границе поля зрения всегда можно определить текущую раскладку.
У меня CapsLock в поле зрения не попадает :)
особенно это касается ноутюуков, где индикатор CapsLock, паример может быть возле самой клавиши CapsLock, которая практически всегда прикрыта рукой при наборе. а убирать руку и косить взгляд как-то неудобно. Вот на Compaq 615 для примера.
У меня всегда один и тот же язык, но с двумя раскладками — RU и US International. Соответственно, возле курсора висит всегда RU.
Если не секрет, зачем такое понадобилось? :)
Семерка, при установке, спрашивает про язык и раскладку.
Автоматом выбираю раскладку «США международная», а остальные поля не трогаю. Получаю в результате два языка — русский и английский, а в русском еще и две раскладки. Мне проще удалить лишний язык, который не стоит основным и оставить две раскладки в одном языке.
Потом привык и всегда теперь так ставлю… Ничем не мешает в жизни — раскладки переключаются по CTRL+SHIFT, никакой разницы не замечаю.
Может быть тогда это повод сделать как положено :)
Вам не кажется, что вы как-то неправильно используете концепцию языков и раскладок? :)
Строго говоря — кажется, но разницы я не замечал до сих пор.
В том, что в русском языке нет латиницы. А раскладка есть.
Язык – это язык, например русский, английский. А раскладка – это конкретное отображение алфавита языка на клавишы: например виндовый йцукен, или вообще дворак.

У меня например на рабочей винде стоит два языка, причем на русском по умолчанию Mac'овая раскладка, при этом можно переключиться и на обычную виндовую, итого 2 языка и 3 раскладки.
UFO just landed and posted this here
Я вот никак не пойму,… нафига мьютекс.
Чтобы гарантировать единственный инстанс приложения.
Отличная вещь.
Правда попытка приладить к дикой связке с терминалом не дала нужного результата, но и без этого стало удобно на обычной машине.
Если кто-то пытается добавить курсоры со своими языками, небольшая памятка:
Не забывайте в файле resource.h установить правильный идентификатор курсора, он должен соответствовать идентификатору языка из этой таблицы: msdn.microsoft.com/en-us/goglobal/bb964664 (последняя колонка). Сейчас уже есть идентификаторы русского и американского английского:
#define IDC_CURSOR1                     1033
#define IDC_CURSOR2                     1049
Есть такая утилита, Aml Maple с гораздо более продвинутым функционалом. Существует она, кстати, со времён Windows 9x.
Перед тем, как писать свой велосипед, я пробовал эту программу. При отображении языка рядом с курсором он меняет свой вид, отбрасывает тень и не инвертирует под собой цвета, что не очень удобно.
А про пунто-свитчер тут правда никто не слышал?
В IDE автоматическую смену раскладки отключаем, т.к. там пунто часто тупит, однако возможность менять раскладку только что написанного текста нажатием одной кнопки остается и в выключенном режиме. Зато исправлять уже написанное мне кажется удобнее, чем превентивно проверять раскладку.
Видимо слышали, видимо пользовались, видимо очень не понравилось. Если что — говорю за себя и некоторых из своего окружения от кого слышал отзывы. да, список исключений куда вносятся putty, есть, но все равно, мне на рус/укр/англ жутко неудобно. Проще оказалось переключать раскладку только по Ctrl+1,2,3 рус, англ, укр в самой винде.
Если нравится переключать «на» язык, то могу поделиться своей программкой, в которой делал настройку Caps — англ, Shift+Caps — рус, Ctrl+Caps — укр. Если быть совсем точным, то сочетания там могут быть любыми. Давно была идея довести эту прожку до ума да выложить в паблик под какой-нибудь свободной лицензией, да всё никак со временем :)
Я сейчас C# изучаю активно, было бы интересно посмотреть…
Эм… Я только не понял почему C#, если честно. Там всё на C++.
есть кому подсказать и перевести :)
Отличная утилита! Приходится использовать эстонскую раскладку — почти все буквы те-же, но спецсимволы совершенно на других местах.
А можно попросить под x64 собрать?
Было бы круто менять цвет курсора (не текстового а обычного) в зависимости от языка
В принципе это не особо сложно сделать, немного изменив приведённый код.
А можно менять цвет мигающей «вертикальной черты» что в поле ввода.
Скажем русский красный английский синий. Ну и пожирней чуть-чуть сделать.
Это затруднительно сделать универсальным способом, потому что очень многие программы используют собственный рендеринг каретки. По сути для каждого случая придётся писать отдельный код.
Sign up to leave a comment.

Articles