Главная страница
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.043 c
15-1147346798
ПЛОВ
2006-05-11 15:26
2006.06.04
Денежный вопрос :)


4-1142414062
Std
2006-03-15 12:14
2006.06.04
Выполнение программы во время выключения или перезагрузки


15-1146909861
Delphi basic
2006-05-06 14:04
2006.06.04
CASE-средства проектирования БД


2-1147893173
valduk
2006-05-17 23:12
2006.06.04
Папка


15-1146830150
Der Nechk@ssoff
2006-05-05 15:55
2006.06.04
Место встречи изменить можно!