Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.11;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.034 c
15-1148047749
tesseract
2006-05-19 18:09
2006.06.11
Outlook , ну чего тут можно сказать :-)


15-1148024063
McSimm
2006-05-19 11:34
2006.06.11
Пароль уже занят, выберите другой


3-1144835299
RomanH
2006-04-12 13:48
2006.06.11
IBDataSet(удаление, добавление, редактирование)


15-1147815021
Ы
2006-05-17 01:30
2006.06.11
Давайте знакомится


2-1148286343
kernel
2006-05-22 12:25
2006.06.11
Пожиратель памяти