![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Приветствую!
Пишу keylogger - проект по одному из курсов. Соответственно необходимо сохранять нажатые клавиши. Это касается всех клавиш. Для этих целей решил использовать функцию WinAPI GetKeyNameText. Вот код самой функции-callback:
В результате, если я например нажимаю на Shift, то функция ничего не возвращает (записывает 0 символов в строку keyname). GetLastError вернул код ошибки 998 - ERROR_NOACCESS 998 (0x3E6) "Invalid access to memory location." Что я делаю не так? В C/CPP - опыта почти нет. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
neokoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 14.4.2010 Репутация: нет Всего: -3 |
Скорее всего ошибка в формировании dwMsg, посмотри повнимательнее. Должно быть что-то типа такого(не проверял):
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
||||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
neokoder, Пробовал твоим способом - та же ошибка. Блин.
xvr,
А какая в принципе ей разница, если это выходной параметр? Я просто передал указатель на место в памяти куда название кнопки нужно записать. Ну и скастил, т.к. иначе функция не хотела его есть. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
Хм.., разница присутствует.
Вы передаете длину строки в элементах KEYNAME_LENGTH у вас = 0x100; то есть 256 байт. фактически вы уменьшили его еще на единицу, так как передаете (keyname+1). То есть размер вашего буфера 255 байт. а функция считает что у нее есть 256 wchar_t, то есть 512 байт. От сюда впелне логично, что это первое на что обратил внимание... |
|||
|
||||
neokoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 14.4.2010 Репутация: нет Всего: -3 |
По-моему просто надо добавить в проект:
Тогда LPTSTR раскроется LPSTR, что и требуется. Это сообщение отредактировал(а) neokoder - 12.3.2011, 20:02 |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
volatile, В принципе вы правы, но поскольку эта функция должна все-го то записать название кнопки, то 256 байт ей за глаза. И правда, передал вместо KEYNAME_LENGTH, (KEYNAME_LENGTH - 1)/2. Не помогло - та же ошибка.
-------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
volatile |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
я специально собрал щас небольшой проект. вот вся программка целиком
выход:
А вот когда я указываю вместо KEYNAME_LENGTH число 512, то и возникает ошибка 998 я думаю вы не внимательно скорректировали KEYNAME_LENGTH ошибка скорей всего, именно здесь! Это сообщение отредактировал(а) volatile - 13.3.2011, 02:03 |
||||||
|
|||||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
neutrino, в общем эта функция обращается к всему блоку что ей предоставили. возможно затирает его нулями. Поэтому нужно передавать реальный размер блока.
И 2-е. Вы смешиваете в одной строке char и wchar_t.
этого не достаточно. вы уже записали в строку один чар '[', увеличили указатель, и передали в функцию нечетный адрес по которому она пишет широкие символы. В общем так не делают. Приведите все к одному, либо char, либо wchar_t. Это сообщение отредактировал(а) volatile - 13.3.2011, 09:38 |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
volatile, Спасибо за помощь!
Я поставил в properties проекта Use Multibyte Char set и все заработало. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Бугога. Ничего не заработало. Мдя... Ну и нарутили с этими кодировками...
Все время я получаю название какой-то одной клавиши (и уж точно не той, что нажали). Нажимаю Shift - получаю Ctrl. Далее неважно что нажимаю - получаю одно и то же. Да, как только поменял тот property, то хоть что-то получать стал. Сейчас у меня следующее: Project.Properties.CharacterSet = 'Use Multi-Byte Character Set'
-------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Вот так работает:
Только не учитывает шифт/капс-лок -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
neutrino, Ну раз вы решили использовать не юникодный проект, то надо быть последовательным:
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |