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

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

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

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

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

Всем доброго времени суток.
Собственно сабж. Как узнать нажал клавишу пользователь или программа, не прибегая к написанию своих дров.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2012, 23:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос как узнать нажатие клавиши было программным или от пользователя (C++):

Как вычислить, было ли нажатие пробела? - C++
Как вычислить, было ли нажатие пробела при использовании объекта cin? Например, читаю строку, ввожу с пробелами, а в файле, в котором...

Как послать нажатие клавиши в другое окно программы? - C++
как послать нажатие клавиши в другое окно программы(неактивное\активное -неважно) а еще что бы окно находило по айди а не по имени, а их...

Как в элементе управления CListCtrl поймать нажатие определенной клавиши на элементе? - C++
Поймать нажатие клавиши вообще - несложно: BOOL CSysbackupDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { ...

Как узнать имя текущего пользователя? - C++
Здравствуйте. Мне нужно узнать имя текущей учетной записи. Подскажите, как это сделать. Гуглю и ничего найти не могу найти.

Нажатие клавиши - C++
Всем привет! как сделать так чтобы в окне output при нажатии Enter курсор переходил на новую строку

Нажатие клавиши - C++
Здравствуйте дорогие друзья, Я начинающий программист и хотел бы задать такой вопрос: Как сделать так, чтобы при нажатии на клавишу,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,270
Записей в блоге: 2
Завершенные тесты: 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, может быть можно перехватывать какую-нибудь функцию ос вызывающуюся при обработке прерывания? В конце концов мне ведь не важно знать какую клавишу нажали, нужно лишь установить сам факт нажатия. Не хотелось бы что бы при установке моего приложения нужно было ещё и драйвер переустанавливать.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,270
Записей в блоге: 2
Завершенные тесты: 1
09.03.2012, 09:00 #10
Цитата Сообщение от NumBot Посмотреть сообщение
Kastaneda, может быть можно перехватывать какую-нибудь функцию ос вызывающуюся при обработке прерывания?
Честно говоря не знаю, не задавался подобным вопросом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2012, 09:00
Привет! Вот еще темы с ответами:

Нажатие клавиши - C++
Всем доброго времени суток. Кто знает как имитировать нажатие button-а? Т.е. Что бы допустим таймер посылал команду и кнопка нажималась,...

Имитировать нажатие клавиши - C++
Проблема такая, есть программа, кот запущена, с пользовательским интерфейсом. Нужно сделать для нее прогу, кот будет через допустим 2...

Нажатие клавиши программно - C++
Здравствуйте, а сложно сделать программу: Нажатие клавиши (прописаной в самом коде) в программе (прописаной в самом кодк) с определённыи...

Нажатие клавиши в консоли - C++
Есть ли метод для нажатия клавиши (любой) в консоли? Т.е. нажал, к примеру, на клавишу Номе и в консоли вывело "Привет" и тп.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.03.2012, 09:00
Ответ Создать тему
Опции темы

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