Pull to refresh
402
0
Evgeny Vrublevsky @VEG

C++ Developer, Reverse Engineer

Send message
Спасибо, исправил.
Скриншот для лого сделан в Windows 7, мне кажется очертания курсора узнаваемы :)
Если кто-то пытается добавить курсоры со своими языками, небольшая памятка:
Не забывайте в файле resource.h установить правильный идентификатор курсора, он должен соответствовать идентификатору языка из этой таблицы: msdn.microsoft.com/en-us/goglobal/bb964664 (последняя колонка). Сейчас уже есть идентификаторы русского и американского английского:
#define IDC_CURSOR1                     1033
#define IDC_CURSOR2                     1049
Может быть тогда это повод сделать как положено :)
Если не секрет, зачем такое понадобилось? :)
К сожалению, не удалось найти внятной документации об этом на MSDN. Судя по этому обсуждению событие HSHELL_LANGUAGE можно отловить только для своего процесса. Хотя это необходимо проверить.
К сожалению, не знаю с чем может быть связана эта проблема :( Попробуйте добавить такой ключ в реестр и перезагрузиться (должно отключить сервисы для восточноазиатских языков).
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IMM]
"LoadIMM"=dword:00000000
Программа при загрузке запоминает текущий системный курсор, при изменении языка она его подменяет, и если в этот момент убить программу, то системный курсор останется подменённым на версию с иконкой языка.
Если вы пытаетесь выбрать язык, для которого нет курсора (а курсор сейчас есть только для русского и для английского), то программа отображает стандартный курсор, который она сохранила при загрузке.
Для нормальной работы после убийства программы нужно сперва сбросить курсор на нормальный, и только после этого запускать новый экземпляр.
Чтобы этого избежать, нужно будет реализовать нормальную процедуру выхода, когда курсор восстанавливался бы сам. В ближайшем обновлении реализуем.
Перед этим вы запускали перманентную версию? Если да, то после её убийства до перезагрузки остаётся курсор с последним языком, и обычная версия использует этот курсор как основной. Чтобы сбросить без перезагрузки, зайдите в настройки курсоров мыши и обновите там курсор редактирования текста сперва на какой-нибудь левый, затем опять на стандартный.
Сразу в заголовке было написано просто C, я позже исправил на C++ — чтобы было понятно, что означает этот комментарий.
После
    if (g_layout != layout)
    {
забыл строчку
        g_layout = layout;
Из-за этой ошибки курсор устанавливается даже тогда, когда это не нужно. В архиве уже исправленная версия.
Ниже в комментариях есть реализация подобного поведения.
Чтобы язык постоянно отображался рядом с курсором курсором редактирования текста, достаточно просто убрать хук на клавиатуру и запустить таймер без ограничений по времени. Кода получится ещё меньше.
#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, которая отлавливала бы событие изменения языка в приложении и меняла соответствующим образом курсор. Заметка на будущее.
У меня Windows 7 SP Professional (английская, x86), плюс тестировал на Windows XP — работало. Вы нажимаете Shift, когда курсор находится над полем для ввода? Дело в том, что индикация появляется только по нажатию на Shift. Я это сделал для того, чтобы в браузере при чтении текста индикация не отображалась на этом же курсоре.
Чтобы использовать некоторые удобные возможности C++, которые доступны при отключении RTL.
Официальная информация по AAC-ELD:
Bitrates: optimized for bit-rates from 24 to 64 kbit/s and more
Delay: down to 15 ms at 64 kbit/s, and up to 32 ms at 24 kbit/s
У Opus такие характеристики:
Bitrates: 6 — 255 kbps (mono) 12 — 510 kbps (stereo)
Delay: 5 — 22.5 ms (чем меньше задержка, тем лучше)
То есть, у Opus и здесь характеристики более привлекательные.
Очень жаль, что кроме Google почти никто из гигантов не поддерживает свободные технологии.
Сейчас под эгидой Xiph (разработчики Ogg Vorbis и FLAC) активно разрабатывается кодек Opus, который по характеристикам выглядит очень выигрышно среди конкурентов.
image
Не знаю, где на этой картинке будет AAC-ELD, но по сравнению с AAC-LD у Opus на порядок больше очков.
Ради интереса посмотрел как это сделано в хроме. Действительно сделали очень удобно. Надеюсь, что когда-нибудь Firefox возьмёт из Chrome подобную организацию профилей и приватного режима.
А мне кажется, вместо средств разработчика (что нужно не всем, а только веб-разработчикам!) лучше бы они встраивали функции популярных расширений.
— Download Statusbar (в Chrome такое уже встроено)
— Tab Mix Plus (многострочные табы — киллерфича перед другими браузерами). Сейчас это расширение активно поддерживается автором. Но мне кажется, лучше чтобы многие из его возможностей были встроены в Firefox.
— Locationbar² (функция быстрого перехода в нужный каталог на сайте простым кликом).
image
— Очень не хватает возможности создания нового окна в приватном режиме (чтобы окно в обычном режиме тоже оставалось)
— All-in-One Sidebar (привоит в порядок все боковые панели, удобная переключалка)
image
Он не нарушает минималистичность в свёрнутом виде, и разворачивается по клику по клику по однопиксельной полоске слева:
image
Автор сейчас практически не занимается этим расширением, поэтому до сих пор кнопки выглядят не очень опрятно (в новых версиях Firefox у маленьких кнопок не должно быть обводок) и есть кое-какие проблемы, решением которых никто не занимается.
— ScrapBook (позволяет сохранять в себе целые страницы или их фрагменты). ИМХО, очень полезный инструмент, и в других браузерах полноценного аналога пока что нет. Но сейчас он не дорабатывается, возникающие проблемы не решаются.

Всё-таки лучше, когда популярные вещи поддерживались разработчиками на должном уровне. Не все авторы расширений, к сожалению, сейчас активно поддерживают свои разработки.

Information

Rating
Does not participate
Location
Финляндия
Date of birth
Registered
Activity