Главная страница
    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.044 c
2-1147936674
Zidane5
2006-05-18 11:17
2006.06.04
Internal error: SY576


15-1146887520
Little)Lamer
2006-05-06 07:52
2006.06.04
C++


2-1147752004
rubey
2006-05-16 08:00
2006.06.04
Ввод через DBGRID


8-1133951868
Procurator
2005-12-07 13:37
2006.06.04
Запись телефонного разговора через Voice модем


15-1147421427
Der Nechk@ssoff
2006-05-12 12:10
2006.06.04
Нужен файл.Срочно!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский