|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
30.06.2013, 23:05 | #1 |
Участник клуба
Регистрация: 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... Как минимум, такой вариант будет работать наверняка, пусть он и самый топорный. // Жара спала, мозг чуть-чуть сконденсировался) А то ваще ниче и никак целых полтора месяца. // канеш, стыдливо показывать такую недоделку, но тут и более к страшным ужасам относились с интересом. |
01.07.2013, 09:49 | #2 |
Далеко не
Участник клуба
Регистрация: 11.08.2011
Сообщений: 1,512
|
Не читал статью пошел сразу к скачке..8.1mb это сильно много.
|
01.07.2013, 10:13 | #3 |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
|
03.07.2013, 00:41 | #4 |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
Код:
Хорошо, это исправил. Теперь попробую описать алгоритм обработки Win и App-клавиш: Надо: чтобы при "одиночном" нажатии App вела себя как обычно, при "комплексном" - как модификатор. Предположим худший вариант, когда состояние клавиши надо устанавливать самостоятельно. Тогда по нажатию/отпусканию Win и App нужно посылать активному окну сообщение о необходимости изменить состояние клавиатуры, чтобы последующие вызовы GetAsyncKeyState() отрабатывались корректно.. 1. По нажатию идет проверка: а) больше никаких модификаторов не активировано б) нажатие не эмулировано 2. Если всё - да, то запоминается эта клавиша. 3. Посылается сообщение о необходимости изменить актуальное состояние клавиатуры 4. Возвращается мусор. До сюда все линейно, а теперь начинается ветвление: 5а. отпущена клавиша не-модификатор. Делать ничего и вызывать системную обработку. 5б. отпущена эта клавиша. 5б.1. Запостить активному окну сообщение об отпускании клавиши. 5б.2. Сгенерировать нажатие клавиши. 5б.3. Вернуть мусор 5в. нажата клавиша модификатор, т.е. обрабатывать как "горячую клавишу" //коряво и неполно как-то вышло... |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Наталкнити на мысли | 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 |