Перехватить сообщение WM_SETFOCUS

Я хочу перехватывать сообщения WM_SETFOCUS во всех текущих окнах. Как лучше всего это сделать?

Думаю, для этой цели можно использовать SetWindowsHookEx. Можно ли использовать его с WH_CALLWNDPROC или WH_MSGFILTER?

Кроме того, упоминается, что процедура перехвата должна быть в отдельной DLL. Требуется ли. Могу ли я не иметь процедуры ловушки в той же DLL, которая устанавливает ловушку.


person anand    schedule 26.01.2010    source источник


Ответы (2)


Да, вы можете иметь процедуру ловушки в той же DLL, которая устанавливает ловушку. Я полагаю, что требование, о котором вы говорите, связано с тем, что вы устанавливаете крючки Windows в другом процессе.

Я не знаком с типом хука WH_CALLWNDPROC, но я считаю, что вы можете использовать WH_CBT, который описан как полезный для приложений «компьютерного обучения», но, похоже, он также имеет некоторые довольно полезные функции. Одно из событий, о которых он уведомлен:

HCBT_SETFOCUS< br> Окно вот-вот получит фокус клавиатуры.

person Josh    schedule 26.01.2010

Процедура ловушки должна быть в dll, но это не обязательно должна быть другая dll, чем та, которую вы используете для установки ловушки. Причина, по которой в документации упоминается «отдельная dll», заключается в том, что они предполагают, что код для установки хука будет в exe, а не в dll.

Хук WH_CALLWNDPROC должен видеть сообщения WM_SETFOCUS, я бы не ожидал, что хук WH_MSGFILTER их увидит, но я не уверен.

Вы должны знать, что если вы собираетесь использовать сообщения WM_SETFOCUS, это НЕ предотвратит установку фокуса на окно.

Какой бы ни была ваша проблема, хук для Windows редко бывает лучшим решением. Если бы вы более конкретно описали, что вы пытаетесь сделать, мы, вероятно, могли бы быть более полезными.

person John Knoeller    schedule 26.01.2010
comment
Хотя я никогда не использовал его лично, в документации CBTProc указано, что фокус может быть остановлен для HCBT_SETFOCUS nCode. Однако я согласен с тем, что это кажется немного неуклюжим, и это не то, как работают такие вещи, как панель ввода планшетного ПК. - person Josh; 26.01.2010
comment
Да, крючки CBT - это особый случай. Они предназначены для «компьютерного обучения», поэтому, согласно теории, вы хотите, чтобы компьютер время от времени притворялся пользователем и следил за тем, что делает пользователь — они в основном переводят всю систему в своего рода однопоточный режим и затем позвольте крючку серьезно возиться с вещами. - person John Knoeller; 26.01.2010