Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Софт
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2013, 23:05   #1
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию Мысли вслух. kbSnorqq kbrd_assistant

Хочу (с/до)делать аналог Punto, каковой конечно сам по себе замечательный, только у него нету того, что мне нужно.
А нужно четыре вещи -
1. Multi-language, или перевод в другую раскладку по точному совпадению слова, а не только по проверке на невозможность нахождения сочетаний букв в данном языке. Потому что только по проверке на полное совпадение слова можно использовать многоязыковую поддержку, иначе если больше двух языков, то будет слишком много неопределенностей.
2. сохранение единой раскладки для всей системы целиком, а не для каждой программы.
3. переключение в нужную раскладку, когда нажимаешь на клавишу Alt и пытаешься выбрать пункт меню. Через "быстрые клавиши" можно работать только при условии, что включена нужная раскладка, в которой набрано само меню.
4. по горячим клавишам переключаться в нужный язык ввода.

Первоначальный запал кончился. Код разросся так, что уже в голове ничего не удерживается, сделано даже меньше трети, работает лишь общесистемное сохранение раскладки, да и то лишь в 32bit-приложениях. Корректность взаимодействия со сторонними программами напрочь не работает. Может получится набраться энтузиазма, расказывая вслух, где парюсь. И самому станет более понятно, или кто чего подскажет.

Выше было вступление, ниже - сам с собой обсуждаю свою же прожку)

Сейчас по плану допилить ХотКии.

В принципе тут что. Использовать системные функции для регистрации горячих клавиш - не пойдет, там слишком много ограничений. Например, хочу использовать App-клавишу тоже как "нормальный модификатор". Проверку на "ХотКи-комбинацию" можно делать в двух местах, либо в контексте сторонней программы (WH_KEYBOARD), куда загружена dll, либо в контексте моей программы (WH_KEYBOARD_LL). Но блокировать реакцию на нажатие App-клавиши из стороннего процесса не получается. Также как и нажатие Win-клавиши обрабатывается на уровне системы. Блокировать их можно только через WH_KEYBOARD_LL каковой исполняется в контексте моей программы. Тестировать на ХотКии через LL_хук вроде как замечательно, только одна фигня - функция GetKeyboardState, вызванная из хост-приложения, врет. Потому что Состояние Клавиатуры - свое для каждого приложения. Получить реальное состояние клавиатуры можно, если вызывать GetAsyncKeyState для каждой клавиши. Но 9 вызовов функции GetAsyncKeyState ровно на порядок больше одного вызвова GetKeyboardState. Правда GetKeyboardState возвращает массив byte[256], а GetAsyncKeyState один short ,так что, наверно, по скорости мало какой выигрыш получится...

Есть еще вариант - просто как-нить получить первоначальное состояние клавиатуры, а потом, в зависимости от полученных событий клавиш, обновлять его актуальность, больше не обращаясь к системе. Но здесь я боюсь странных глюков и сбоев, когда в течении нескольких 10 тыс. нажатий что-то отработается некорректно и currentKbState[256] станет неверно.

Итак, наверно можно попробовать проверку состояний через GetAsyncKeyState каждого "модификатора" (Alt, Ctrl, Shift, Win und App) из WH_KEYBOARD_LL_proc... Как минимум, такой вариант будет работать наверняка, пусть он и самый топорный.

// Жара спала, мозг чуть-чуть сконденсировался) А то ваще ниче и никак целых полтора месяца.

// канеш, стыдливо показывать такую недоделку, но тут и более к страшным ужасам относились с интересом.
Smogg вне форума Ответить с цитированием
Старый 01.07.2013, 09:49   #2
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

Не читал статью пошел сразу к скачке..8.1mb это сильно много.
Кольша вне форума Ответить с цитированием
Старый 01.07.2013, 10:13   #3
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от Кольша Посмотреть сообщение
8.1mb это сильно много.
Нук, 17,6Мб базы в unicode не может жаться до 100кб. Это база для телефонного Т9 использует один байт на слово, а у меня тупо список слов, без оптимизаций. Плюс Qtовые dll.
Smogg вне форума Ответить с цитированием
Старый 03.07.2013, 00:41   #4
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Код:
static DWORD hotPrev = 0;
	DWORD hotCode;
	
	if (((KBDLLHOOKSTRUCT *)lParam)->flags & LLKHF_UP)
		hotPrev = 0;
	hotCode = sets->GenerateHotCode_LL_LeftRight((KBDLLHOOKSTRUCT *)lParam);
	if (hotPrev == hotCode)
		return 678;
Генерируется hotCode, т.е. scanCode + флаги клавиш-модификторов.

Хорошо, это исправил.

Теперь попробую описать алгоритм обработки Win и App-клавиш:

Надо:
чтобы при "одиночном" нажатии App вела себя как обычно, при "комплексном" - как модификатор.

Предположим худший вариант, когда состояние клавиши надо устанавливать самостоятельно.
Тогда по нажатию/отпусканию Win и App нужно посылать активному окну сообщение о необходимости изменить состояние клавиатуры, чтобы последующие вызовы GetAsyncKeyState() отрабатывались корректно..

1. По нажатию идет проверка:
а) больше никаких модификаторов не активировано
б) нажатие не эмулировано
2. Если всё - да, то запоминается эта клавиша.
3. Посылается сообщение о необходимости изменить актуальное состояние клавиатуры
4. Возвращается мусор.

До сюда все линейно, а теперь начинается ветвление:
5а. отпущена клавиша не-модификатор. Делать ничего и вызывать системную обработку.
5б. отпущена эта клавиша.
5б.1. Запостить активному окну сообщение об отпускании клавиши.
5б.2. Сгенерировать нажатие клавиши.
5б.3. Вернуть мусор
5в. нажата клавиша модификатор, т.е. обрабатывать как "горячую клавишу"

//коряво и неполно как-то вышло...
Smogg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наталкнити на мысли Sylar9 Общие вопросы C/C++ 5 25.05.2013 20:48
Чудо инженерной мысли sweex1234 Помощь студентам 1 17.02.2011 19:02
Несвоевременные мысли. (М. Горький) Rapid Свободное общение 11 01.12.2010 17:32
Мысли Elm0 Свободное общение 0 23.06.2007 21:42