Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.04;
Скачать: CL | DM;

Вниз

WM_KEYDOWN не печатает символ   Найти похожие ветки 

 
Mr tray   (2006-05-18 21:59) [0]

Почему можно послать в поле ввода WM_CHAR и символ напечатается, а если послать WM_KEYDOWN - то символ не напечатается? Можно ли печатать символ и посылать сообщение о нажатии, допустим, кнопки "стрелка влево" с помощью одного и того же сообщения?


 
begin...end ©   (2006-05-18 22:18) [1]

> Mr tray   (18.05.06 21:59)

> Можно ли печатать символ и посылать сообщение о нажатии,
> допустим, кнопки "стрелка влево" с помощью одного и того
> же сообщения?

Можно. Только для этого нужно посылать сообщение, используя PostMessage, а не SendMessage. А в цикле выборки сообщений потока, которому принадлежит окно поля ввода, должны быть вызовы TranslateMessage и DispatchMessage.


 
Mr tray   (2006-05-19 00:37) [2]

а если я хочу нажать какую-то кнопку из функции хука клавы в чужом окне? я не могу поставить там (в чужом окне) TranslateMessage и DispatchMessage.


 
begin...end ©   (2006-05-19 10:00) [3]

> Mr tray   (19.05.06 00:37) [2]

> я не могу поставить там (в чужом окне) TranslateMessage
> и DispatchMessage

И, скорее всего, не надо. Потому что, скорее всего, они там уже есть. Это стандартный цикл, и он есть практически в любом GUI-приложении.

Он имеет примерно такой вид:

while GetMessage(msg, 0, 0, 0) do
begin
 TranslateMessage(msg);
 DispatchMessage(msg)
end.

Если в то время, когда edit имеет фокус ввода, на клавиатуре нажимается какая-нибудь клавиша, система ставит в очередь потока, которому этот edit принадлежит, асинхронное сообщение WM_KEYDOWN. Оно выбирается потоком из очереди (GetMessage) и передаётся в функцию TranslateMessage, которая, если WM_KEYDOWN содержит код алфавитно-цифровой или одной из специальных (Enter, Backspace) клавиш, генерирует соответствующее сообщение WM_CHAR и ставит его в очередь. Оно будет чуть позже выбрано оттуда и передано (DispatchMessage) оконной процедуре edit"а, как это только что произошло с WM_KEYDOWN.

Символы в поле ввода появляются именно в ответ на WM_CHAR, а не на WM_KEYDOWN. Не придёт WM_CHAR -- не будет и символов. Поэтому для того, чтобы они появились, нужно либо сразу послать WM_CHAR (причём без разницы, синхронно или асинхронно), либо послать WM_KEYDOWN (но обязательно асинхронно, чтобы оно прошло через TranslateMessage, и WM_CHAR сгенерировалось автоматически).



Страницы: 1 вся ветка

Текущий архив: 2006.06.04;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.086 c
15-1145611017
Paradoxer
2006-04-21 13:16
2006.06.04
Работа с Paradox без BDE


1-1145970545
Neo Trinitron
2006-04-25 17:09
2006.06.04
Аномалии: TPageControl


3-1144923173
KyRo
2006-04-13 14:12
2006.06.04
Диалог ConnectionString


15-1147350795
carmen
2006-05-11 16:33
2006.06.04
tpu


1-1146035231
comtat
2006-04-26 11:07
2006.06.04
Маштабирование