Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.06.11;
Скачать: [xml.tar.bz2];

Вниз

waitmessage только с определенным сообщением   Найти похожие ветки 

 
Mr tray   (2006-05-20 18:43) [0]

я знаю функцию waitmessage. только она работает для всех сообщений. а можно ли, чтобы выполнение кода приостановилось до тех пор, пока какое то именно сообщение не придет?


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

А какого типа сообщения интересуют -- синхронные или асинхронные?

Например, функция GetMessage не возвратит управление до тех пор, пока в очереди потока не будет обнаружено асинхронное сообщение из диапазона  wMsgFilterMin...wMsgFilterMax (есть и некоторые другие причины выхода из GetMessage, но о них умолчим). Однако синхронные сообщения из этого диапазона будут во время работы GetMessage передаваться соответствующим оконным процедурам.


 
Mr tray   (2006-05-21 00:10) [2]

смотрите. кажется, я интересуюсь асинхронными сообщениями, потому что посылаю их с помощью postmessage;
такой вот код:
postmessage(wnd,WM_KEYDOWN,C,0);
getmessage(msg,wnd,WM_KEYDOWN,WM_KEYDOWN);

как я понимаю, этот код должен послать сообщение и подождать, пока оно дойдет до адресата?

P.S. спасибо, что помогаете


 
begin...end ©   (2006-05-21 08:54) [3]

> Mr tray   (21.05.06 00:10) [2]

> такой вот код:
> postmessage(wnd,WM_KEYDOWN,C,0);
> getmessage(msg,wnd,WM_KEYDOWN,WM_KEYDOWN);

Не понял. Это последовательные вызовы? GetMessage ведь должно быть в потоке, которому принадлежит окно wnd. Или у Вас отправка сообщения производится из этого же потока?

Вообще, подробнее расскажите о задаче.


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

да, это последовательные вызовы. этот код содержится в функции-хуке, которая, как я понимаю, инициализируется в потоке (не знаю, насколько это грамотно сказано), которому принадлежит wnd (wnd ранее присвоено значение функции getfocus).


 
begin...end ©   (2006-05-21 20:29) [5]

> Mr tray   (21.05.06 18:59) [4]

Смысл этих действий пока не очень понятен. Поясните, для чего нужен хук, для чего нужно посылать WM_KEYDOWN, для чего нужно ждать, и т.д.

GetFocus действительно может возвращать дескрипторы только тех окон, которые принадлежат текущему потоку (и имеют фокус ввода). Если окно с фокусом принадлежит другому потоку, она возвратит ноль.


 
десятиклассник   (2006-05-21 22:25) [6]

так. в общем. у меня хук на клавиатуру. я схватываю сообщение о клавише, и если это сообщение "клавиша нажата" (может быть ещё "клавиша отжата), то я перевожу код нажатой клавиши в char и делаю его (char"a)транслитерацию (программа предназначена для транслитерации русских символов в латинские прямо при их вводе). Если char - это буква не из русского алфавита или вообще не буква, то ставлю у хука result:=0 и всё, то есть пропускаю дальше посланное сообщение. В противном же случае этот char транслитерируется, и делаю вот что с полученным char"ом
wnd:=getfocus;
h:=LoadKeyboardLayout("00000409",KLF_ACTIVATE);{так как посылается буква из латинского алфавита, а в данный момент раскладка русская}
postmessage(wnd,WM_KEYDOWN,vkkeyscanex(C,h),0);{С - это char}
getmessage(msg,wnd,WM_KEYDOWN,WM_KEYDOWN);{msg это просто tagmsg, чтобы было что вставить на место параметра}
LoadKeyboardLayout("00000419",KLF_ACTIVATE);{вернуть раскладку на место}

ждать, по-моему, нужно потому, что postmessage не ждет, пока сообщение дойдет до адресата, а мне это нужно, потому что код клавиши должен дойти тогда, когда раскладка латинская. жду WM_KEYDOWN с помощью getmessage, буква вводится, и я сменяю раскладку обратно на русскую. я не использую WM_CHAR, потому что фокус может стоять вообще не на поле ввода, а допустим на окне с кнопками, для которых существуют горячие клавиши. тогда WM_CHAR будет неуместен.
GetMessage чё то фигово работает, то есть вводится какая то фигня (буквы P).
А вот вопрос: можно ли как то узнать, является ли значение getfocus полем ввода? поле ввода, это не обязательно Edit, TEdit или TMemo.


 
Mr tray   (2006-05-21 22:26) [7]

блин, десятиклассник это, я, то есть Mr Tray


 
begin...end ©   (2006-05-22 13:00) [8]

> десятиклассник   (21.05.06 22:25) [6]

> я не использую WM_CHAR, потому что фокус может стоять вообще
> не на поле ввода, а допустим на окне с кнопками, для которых
> существуют горячие клавиши. тогда WM_CHAR будет неуместен.

Не совсем понятно, почему неуместен.

Я бы всё же использовал хук WH_GETMESSAGE на WM_CHAR. Тогда не надо переключать раскладки, не нужно посылать сообщения, не нужно ничего ждать, и т.д. -- нужно всего лишь заменить код символа в структуре, указатель на которую передаётся в функцию хука как параметр.

> А вот вопрос: можно ли как то узнать, является ли значение
> getfocus полем ввода? поле ввода, это не обязательно Edit,
> TEdit или TMemo.

RealGetWindowClass возвратит "Edit" для Edit, TEdit и TMemo.


 
ANB ©   (2006-05-22 13:05) [9]


> десятиклассник   (21.05.06 22:25) [6]

Если отправляешь сообщение через PostMessage, то возможности узнать, когда оно будет обработано нет.

Подход некорректный, смотри совет
> begin...end ©   (22.05.06 13:00) [8]


 
Mr tray   (2006-05-22 22:06) [10]

спасибо


 
Mr tray   (2006-05-22 23:25) [11]

вот я в хуке в lparam меняю wparam. так как message = WM_CHAR, поэтому TMsg(Pointer(lparam)^).wparam - это ascii код символа. этот код я меняю, и до адресата доходит измененная посылка. только: есть буквы, которые траснлитерируютя в 2 символа (ш - sh). я делаю так
 n:=length(forinput);  {forinput транслитерированный символ. тип string}
 if n=1 then
   pmsgv^.wParam:=ord(forinput[1])  {pmsgv это Pointer(lParam)}
 else begin
   pmsgv^.wParam:=ord(forinput[n]);
   for i:=1 to n-1 do
     sendmessage(wnd,WM_CHAR,ord(forinput[i]),0); {wnd это значение ранее вызванного getfocus}
 end;

всё бы хорошо. только вот некоторые объекты не реагируют на WM_CHAR, как, допустим, все поля ввода в опере и в страницах, выведенных ею (на WM_KEYDOWN реагируют). А вот измененный lparam она принимает. Можно ли как то без sendmessage а только с помощью изменения lparam передать 2 символа адресату? или можно ещё как то решить эту задачу?



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

Форум: "Начинающим";
Текущий архив: 2006.06.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.011 c
2-1148372478
Мурзилка
2006-05-23 12:21
2006.06.11
время


15-1147840595
Layner
2006-05-17 08:36
2006.06.11
ActiveX в браузере IE6, браузер постоянно пишет:


3-1145428578
VictorT
2006-04-19 10:36
2006.06.11
Проблема с union в MySQL


15-1148126613
wirg
2006-05-20 16:03
2006.06.11
Нужна блок схема


15-1147325557
Случайный прохожий
2006-05-11 09:32
2006.06.11
Простая задачка





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