Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
NumBot
13 / 13 / 0
Регистрация: 16.02.2012
Сообщений: 59
#1

как узнать нажатие клавиши было программным или от пользователя - C++

06.03.2012, 23:50. Просмотров 1015. Ответов 9
Метки нет (Все метки)

Всем доброго времени суток.
Собственно сабж. Как узнать нажал клавишу пользователь или программа, не прибегая к написанию своих дров.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
07.03.2012, 01:08     как узнать нажатие клавиши было программным или от пользователя #2
NumBot, ну ... теоретически можно отлавливать было ли WM_KEYDOWN и WM_KEYUP, ато ведь посылают обычно WM_KEYDOWN да и всё
Но соглашусь что это не вариант, но вроде никак не узнать, винде всё равно как там сообщение в очеред появилось: нажимал ли пользователь чего или его туда какая программа запихнула.
NumBot
13 / 13 / 0
Регистрация: 16.02.2012
Сообщений: 59
07.03.2012, 01:14  [ТС]     как узнать нажатие клавиши было программным или от пользователя #3
Да, возможно, но очень слабая защита получается.
Есть вариант использовать обратбоку месов винды и одновременно использовать поддержку DirectInput. Правда такая защита помоему обходится банальныи SendInput. Нужно что-то другое.
Можно ли как-то узнать приходило ли прерывание от клавы? Без разницы какое, просто узнать и после этого принимать месы.
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
07.03.2012, 01:19     как узнать нажатие клавиши было программным или от пользователя #4
Цитата Сообщение от NumBot Посмотреть сообщение
Можно ли как-то узнать приходило ли прерывание от клавы?
Можно, в обычной программе на asm, но не под виндой же. Хотя я винапи углублённо не изучал, Петзольда вон даже второй томик ещё не дочитал.
NumBot
13 / 13 / 0
Регистрация: 16.02.2012
Сообщений: 59
08.03.2012, 20:07  [ТС]     как узнать нажатие клавиши было программным или от пользователя #5
На асме не писал, поэтому хотелось бы получить мнение знающего человека по данному вопросу.
Можно ли реализовать данную возможность на асме под винду, апаратнонезависимо?
Можно ли сэмулировать прерывание? В какую сторону копать, что изучать?
Возможно данные вопросы не входят в тему с++ для новичков и стоит её перенести в другой раздел?

Добавлено через 10 часов 44 минуты
Неужели никто не поможет

Добавлено через 21 час 9 минут
Ладно, буду искать сам. Найду решение - отпишусь
krdev
2 / 2 / 0
Регистрация: 19.02.2012
Сообщений: 12
Завершенные тесты: 1
08.03.2012, 20:22     как узнать нажатие клавиши было программным или от пользователя #6
если нажал юзер - генерируются сообщения WM_KEYDOWN и WM_KEYUP.
если прога - WM_SYSKEYDOWN и WM_SYSKEYUP.
вроде так.
NumBot
13 / 13 / 0
Регистрация: 16.02.2012
Сообщений: 59
08.03.2012, 20:38  [ТС]     как узнать нажатие клавиши было программным или от пользователя #7
И пользователь и программа могут генерировать подобные месаги

WM_SYSKEYDOWN message
Posted to the window with the keyboard focus when the user presses the F10 key (which activates the menu bar) or holds down the ALT key and then presses another key. It also occurs when no window currently has the keyboard focus; in this case, the WM_SYSKEYDOWN message is sent to the active window. The window that receives the message can distinguish between these two contexts by checking the context code in the lParam parameter.
Kastaneda
Форумчанин
Эксперт С++
4480 / 2842 / 227
Регистрация: 12.12.2009
Сообщений: 7,225
Записей в блоге: 1
Завершенные тесты: 1
08.03.2012, 22:02     как узнать нажатие клавиши было программным или от пользователя #8
Цитата Сообщение от Gepar Посмотреть сообщение
винде всё равно как там сообщение в очеред появилось: нажимал ли пользователь чего или его туда какая программа запихнула.
На самом деле не все равно. Если сообщение послано пользователем, то где-то в глубине винды состояние клавы/мыши не обновляется. Например если программно сдвинуть курсор мыши, потом руками кликнуть мышь, то клик будет в том месте, где был курсор до программного сдвига.
Единственное, что могу предложить - это читать порт клавы. Но это возможно только из kernel mode, т.е. придется писать драйвер. Или скачать драйвер, который открывает доступ к портам из user mode (как раз сегодня гуглил, такие есть), после его запуска можно читать порты как под ДОСом, т.е. из user mode.
NumBot
13 / 13 / 0
Регистрация: 16.02.2012
Сообщений: 59
08.03.2012, 23:20  [ТС]     как узнать нажатие клавиши было программным или от пользователя #9
Kastaneda, может быть можно перехватывать какую-нибудь функцию ос вызывающуюся при обработке прерывания? В конце концов мне ведь не важно знать какую клавишу нажали, нужно лишь установить сам факт нажатия. Не хотелось бы что бы при установке моего приложения нужно было ещё и драйвер переустанавливать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2012, 09:00     как узнать нажатие клавиши было программным или от пользователя
Еще ссылки по теме:
C++ Нажатие клавиши программно
C++ Нажатие клавиши в консоли
C++ Реакция на нажатие клавиши
C++ Имитировать нажатие клавиши
C++ Авто нажатие клавиши в консоли

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4480 / 2842 / 227
Регистрация: 12.12.2009
Сообщений: 7,225
Записей в блоге: 1
Завершенные тесты: 1
09.03.2012, 09:00     как узнать нажатие клавиши было программным или от пользователя #10
Цитата Сообщение от NumBot Посмотреть сообщение
Kastaneda, может быть можно перехватывать какую-нибудь функцию ос вызывающуюся при обработке прерывания?
Честно говоря не знаю, не задавался подобным вопросом.
Yandex
Объявления
09.03.2012, 09:00     как узнать нажатие клавиши было программным или от пользователя
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru