![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
Может тебе попробовать DirectInput? Там опрос устройство через промежутки времени осуществляется...
|
|||
|
||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
EgoBrain, может быть, только я не знаю как им пользоваться. Это смешно, но я попробую, присоединяйтесь пожалуйста, кто хочет.
Кажется "bems" в похожей теме мне помогал вместе с остальными участниками дискуссии: http://forum.vingrad.ru/index.php?showtopi...t&p=2404095 |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
хех, начитались чего-то там... в любом случае, это вообще ноль, по сравнению с вашим кодом, который нагружает процессор на все 100% ![]() |
|||
|
||||
Dem_max |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
DirectInput использует WM_INPUT
http://msdn.microsoft.com/en-us/library/ee418864 Это сообщение отредактировал(а) Dem_max - 15.5.2013, 19:20 -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
||||
|
|||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Вообщем нашёл и GlobalHook пример на С# и выяснил, что есть один косяк в одновременном нажатии 3-х кнопок, не знаю чей, но он есть. И GetAsyncKeyState также не справляется с одновременным нажатием(да даже и последовательным нажатием) некоторых комбинаций клавиш, хотя некоторые комбинации(пробовал до 5 штук одновременно) обрабатывает нормально.
Как пример, с помощью ниже прикреплённых исходников программы, нельзя отловить одновременное нажатие "G", "H", "7". Исходники взял с сайта проекта "CodeProject"(прикреплены ниже). Это сообщение отредактировал(а) Jr13san - 19.5.2013, 19:46 Присоединённый файл ( Кол-во скачиваний: 1 ) ![]() |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Это косяк клавиатуры. т.е самого девайса. Да и вообще это не косяк, а нормальное поведение. PC клавиатура расчитана на последовательные нажатия, а вы видимо хотите испольнять на ней пятую симфонию Бетховена. ![]() Исключения составляют только комбинации с переключателями: ctrl, alt, shift, win Такие комбинации нормальная клавитура не обязана переваривать. Если разбираетесь немного в электронике, просто полюбопытсвуйте внутренним устройством клавиатуры. Там матрица, и при определенных комбинациях 3-ёх и более клавиш, там просто физически невозможно определить какие именно клавиши были нажаты. Причем невозможные комбинации, разняцца для разных моделей. Короче, говоря языком С++, нажатие 3 клавиш одновременно, - это UB. Оно может и сработать иногда, но чаще - нет ![]() Это сообщение отредактировал(а) volatile - 20.5.2013, 00:12 |
|||
|
||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Да нет, просто у меня старый пример был на одну кнопку рассчитан, и недавно я стал расширять возможности, хотя бы до 5 кнопок одновременно нажатых(это с небольшим запасом). И в итоге на win7 ничего не работает, вот приходится либо искать подсказки по "инжектингу" dll в процесс и ставить хуки, либо отступиться от этого всего и не париться больше. Мне вот просто ради интереса важно понять и попробовать сделать рабочий пример. На Youtube нашёл видео о том, как внедрить dll в процесс на c++ и от туда вызвать прорисовку синего прямоугольника при нажатии кнопки F1. Попробую, может что-то получится...
Вообщем на счёт клавиатуры ясно. Чем больше кнопок тебе нужно отследить одновременно, тем больше придётся паять дорожек. В принципе есть шина I2C с линией данных SDA и линией синхронизации SCL, может через них можно как-то это реализовать? Или просто пускай винда опрашивает клавиатуру и создаёт очередь нажатых кнопок. Если кнопка повторяется, то не пишем её в очередь, иначе записываем. А если кнопка отпущена, то удаляем её из очереди. Не знаю. Ну да ладно, это уже вопрос по аппаратной части. Это сообщение отредактировал(а) Jr13san - 20.5.2013, 12:42 |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Венда не опрашивает клавиатуру. В клавиатуре (обычной), есть свой микроконтроллер, который опрашивает матрицу кнопок. и в случае нажатия, отправляет код нажатой клавиши в комп. А венда (вообще операционка), уже переваривает этот код. (для 3-ей и более кнопки одновременно (исключая ctrl, alt, shift, win), просто не будут поступать коды нажатых клавиш, от самой клавиатуры. Если же вы хотите делать свой клавиатурный девайс, то да можно делать все что угодно. Но это уже совсем, совсем другая тема... Это сообщение отредактировал(а) volatile - 20.5.2013, 13:28 |
|||
|
||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Да, я загорелся идеей и в принципе кое-что придумал в связке с демультиплексорами. Наброски схемы уже есть. Осталось навести последние штрихи и можно начинать топить пластмассу ![]() ![]() Проблема в том, кто и как будет обрабатывать сигналы с клавиатуры? Я по крайней мере не знаю куда уходят 6 сигналов с обычной клавиатуры.. ![]() Ладно, не буду оффтопить. Нашёл простой исходничёк для работы с клавиатурой на сайте: http://www.wischik.com/lu/programmer/keymouse.html При нажатии на "правый Alt" происходит эмуляция нажатия на правую кнопку мышки. Есть и исходник и готовая программка, которую нужно закрывать через диспетчер, потому что у неё нет формы. Буду разбираться, может что-то и получится. Это сообщение отредактировал(а) Jr13san - 24.5.2013, 12:18 |
|||
|
||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Прощу прощения за дабл-постинг, но у меня есть один вопрос.
Начну с небольшого исходника, нарытого в недрах интернета: Консольное приложение:
Значит ставится хук на события мышки и вообщем-то они отрабатывают на ура, НО мне потребовалось отследить, то, в какую сторону происходит вращение колёсика мышки. И как на зло wParam всегда возвращает одно и то же значение не зависимо от стороны вращения колеса мышки. Т.е. хоть преобразуй с помощью макроса "GET_WHEEL_DELTA_WPARAM(wParam)", хоть не преобразуй - результат один и тот же. Помогите пожалуйста. Весь интернет перерыл, пока что ничего не помогает. Это сообщение отредактировал(а) Jr13san - 26.5.2013, 12:18 |
|||
|
||||
volatile |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
зачем весь интернет? достаточно MSDN учитесь пользовацца. у меня вот тоже не было готового ответа решение такое:
Выдает 120 при кручении в одну сторону и -120 в другую. кроме того у вас здесь очень нехорошо, надо добавить:
|
||||||
|
|||||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
volatile, круто! Спасибо за помощь!
По крайней мере я догадывался, что нужно делать какое-то хитрое преобразование, похожее на получение координат, когда происходит событие WM_MOUSEMOVE:
Вот смотри какая закономерность. Если есть теория, то сразу до меня не доходит что и как работает. Но как только появляются рабочий пример практической части, тогда есть в чём разбираться, и когда ты разбираешься, то никакая теория не нужна. По сути дела теория, да и вообще я говорю про MSDN нужен в качестве справочника для опытных программистов. А начинать нужно всегда с простенького примерчика. Ладно. Дело близится к концу. Постараюсь в ближайшее время выложить исходники, чтобы другим по легче было. Да. Ребята всем спасибо за участие в теме и за поддержку! Это сообщение отредактировал(а) Jr13san - 26.5.2013, 21:48 |
|||
|
||||
KaZepKa |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 29.10.2011 Репутация: нет Всего: нет |
Дабы не создавать новую темку, спрошу тут:
Через WH_MOUSE_LL можно ли ловить зажим какой-нить кнопки мыши? Вот если хукать клаву(WH_KEYBOARD_LL), зажим ловиться через
т.е. если зажал кнопку E, то действия после if повторяются, пока не отожмешь кнопку. А вот если хукать мышь(например, среднюю кнопку мыши):
Действие выполняется только один раз при нажатии на эту кнопку, но не зажимает. Так вот, как правильно хукнуть в таком случае?) Это сообщение отредактировал(а) KaZepKa - 27.5.2013, 08:55 |
||||
|
|||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Все верно, тебе же сообщение пришло о нажатии, тебе чего еще нужно то ??? -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
KaZepKa |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 29.10.2011 Репутация: нет Всего: нет |
по идеи да, но при зажатии кнопки на клавиатуре, почему-то действия повторяются, а в случаи с мышью такого нет... Получилось реализовать зажим, через таймер: при WM_MBUTTONDOWN, активирую таймер, при WM_MBUTTONUP разрушаю, а нужные действия произвожу при отлове WM_TIMER. Так, правильно или есть более ровные способы?) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |