Форум: "Начинающим";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.04 c