Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.036 c
3-1144959988
Krants
2006-04-14 00:26
2006.06.04
Развернуть БД


6-1138812061
Volf_555
2006-02-01 19:41
2006.06.04
Как организовать чат через Интернет


3-1144997749
RomanH
2006-04-14 10:55
2006.06.04
Доступ из БД1 в БД2 одного коннекта


4-1142316961
_white_
2006-03-14 09:16
2006.06.04
Чтение из памяти другой программы


3-1144642973
Старик
2006-04-10 08:22
2006.06.04
Выбор решения по спискам (DBCombobox vs LookUpCombobox)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский