Вопрос по Хукам в Win32.
От: MaelStrom  
Дата: 07.08.05 12:30
Оценка:
В своей проге, хочу отлавливать всю активность с клавиатуры.
Сделал хук на клаву с функцией фильтром. Если я не ошибаюсь, через эту функцию проходят
WM_KEYUP, WM_KEYDOWN, WM_SYSKEYUP, WM_SYSKEYDOWN и WM_CHAR. А мне надо только обрабатывать
сообщение WM_CHAR. Как его отличить от других сообщений?


07.08.05 23:01: Перенесено из 'C/C++'
Re: Вопрос по Хукам в Win32.
От: VladGal  
Дата: 07.08.05 13:45
Оценка: -1
Здравствуйте, MaelStrom, Вы писали:

MS>В своей проге, хочу отлавливать всю активность с клавиатуры.

MS>Сделал хук на клаву с функцией фильтром. Если я не ошибаюсь, через эту функцию проходят
MS>WM_KEYUP, WM_KEYDOWN, WM_SYSKEYUP, WM_SYSKEYDOWN и WM_CHAR. А мне надо только обрабатывать
MS>сообщение WM_CHAR. Как его отличить от других сообщений?
В SetWindowsHookEx надо указать тип функции перехвата сообщений WH_KEYBOARD_LL,
тогда callback-функция на которую передаваеться указатель в SetWindowsHookEx, имеет следующий прототип:
LRESULT CALLBACK LowLevelKeyboardProc( int code, WPARAM wParam, LPARAM lParam )- где wParam — идентификатор сообщения.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: Вопрос по Хукам в Win32.
От: Nazik Россия  
Дата: 07.08.05 13:50
Оценка: 1 (1)
Надо поставить хук не на WH_KEYBOARD, а на WH_GETMESSAGE... Будут перехватываться все сообщения, включая WM_CHAR... Ну а далее, ясное дело, фильтровать WM_CHAR (в GetMsgProc lParam будет указателем на структуру MSG)

P.S. Разумнее было бы задать этот вопрос в группу WINAPI

Здравствуйте, MaelStrom, Вы писали:

MS>В своей проге, хочу отлавливать всю активность с клавиатуры.

MS>Сделал хук на клаву с функцией фильтром. Если я не ошибаюсь, через эту функцию проходят
MS>WM_KEYUP, WM_KEYDOWN, WM_SYSKEYUP, WM_SYSKEYDOWN и WM_CHAR. А мне надо только обрабатывать
MS>сообщение WM_CHAR. Как его отличить от других сообщений?
Re[2]: Вопрос по Хукам в Win32.
От: Nazik Россия  
Дата: 07.08.05 13:53
Оценка:
Помимо того, что данная функция работает тока в NT-подобные системах (в наши дни это мелочь), у нее есть еще один недостаток:

wParam
[in] Specifies the identifier of the keyboard message. This parameter can be one of the following messages: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP.


т.е. вожделенного WM_CHAR тут нет... Видимо, мое решение (описанное в соседнем сообщении), единсвенное (или не единсвенное) верное!

Здравствуйте, VladGal, Вы писали:

VG>Здравствуйте, MaelStrom, Вы писали:


MS>>В своей проге, хочу отлавливать всю активность с клавиатуры.

MS>>Сделал хук на клаву с функцией фильтром. Если я не ошибаюсь, через эту функцию проходят
MS>>WM_KEYUP, WM_KEYDOWN, WM_SYSKEYUP, WM_SYSKEYDOWN и WM_CHAR. А мне надо только обрабатывать
MS>>сообщение WM_CHAR. Как его отличить от других сообщений?
VG>В SetWindowsHookEx надо указать тип функции перехвата сообщений WH_KEYBOARD_LL,
VG>тогда callback-функция на которую передаваеться указатель в SetWindowsHookEx, имеет следующий прототип:
VG>LRESULT CALLBACK LowLevelKeyboardProc( int code, WPARAM wParam, LPARAM lParam )- где wParam — идентификатор сообщения.
Re[2]: Вопрос по Хукам в Win32.
От: VladGal  
Дата: 07.08.05 14:07
Оценка:
Действительно, не заметил
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: Вопрос по Хукам в Win32.
От: VladGal  
Дата: 07.08.05 14:15
Оценка:
Здравствуйте, Nazik, Вы писали:

N>Помимо того, что данная функция работает тока в NT-подобные системах (в наши дни это мелочь), у нее есть еще один недостаток:


N>

N>wParam
N>[in] Specifies the identifier of the keyboard message. This parameter can be one of the following messages: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP.


N>т.е. вожделенного WM_CHAR тут нет... Видимо, мое решение (описанное в соседнем сообщении), единсвенное (или не единсвенное) верное!

WM_KEYDOWN + флаг предыдущего состояния клавиши (в lParam) == WM_CHAR?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: Вопрос по Хукам в Win32.
От: VladGal  
Дата: 07.08.05 14:15
Оценка:
Здравствуйте, Nazik, Вы писали:

N>Помимо того, что данная функция работает тока в NT-подобные системах (в наши дни это мелочь), у нее есть еще один недостаток:


N>

N>wParam
N>[in] Specifies the identifier of the keyboard message. This parameter can be one of the following messages: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP.


N>т.е. вожделенного WM_CHAR тут нет... Видимо, мое решение (описанное в соседнем сообщении), единсвенное (или не единсвенное) верное!

WM_KEYUP + Код предыдущего состояния клавиши (в lParam) == WM_CHAR?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: Вопрос по Хукам в Win32.
От: Nazik Россия  
Дата: 07.08.05 14:30
Оценка:
Похоже, что нет:


The WM_CHAR message is posted to the window with the keyboard focus when a WM_KEYDOWN message is translated by the TranslateMessage function. The WM_CHAR message contains the character code of the key that was pressed.



Здравствуйте, VladGal, Вы писали:

VG>Здравствуйте, Nazik, Вы писали:


N>>Помимо того, что данная функция работает тока в NT-подобные системах (в наши дни это мелочь), у нее есть еще один недостаток:


N>>

N>>wParam
N>>[in] Specifies the identifier of the keyboard message. This parameter can be one of the following messages: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP.


N>>т.е. вожделенного WM_CHAR тут нет... Видимо, мое решение (описанное в соседнем сообщении), единсвенное (или не единсвенное) верное!

VG>WM_KEYUP + Код предыдущего состояния клавиши (в lParam) == WM_CHAR?
Re: Вопрос по Хукам в Win32.
От: Аноним  
Дата: 07.08.05 16:42
Оценка:
Все сделал через WH_GETMESSAGE. Когда набираешь текст в блокноте, все нормально,
а в ворде все символы четверятся и восьмерятся
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.