Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

waitmessage только с определенным сообщением [D6, XP]


Mr tray ©   (2006-05-20 18:43:00) 

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


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

вот я в хуке в 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 символа адресату? или можно ещё как то решить эту задачу?


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

спасибо


ANB   (2006-05-22 13:05:00) [3]


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

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

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


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

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

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

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

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

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

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


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

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


десятиклассник   (2006-05-21 22:25:00) [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.


begin...end   (2006-05-21 20:29:00) [7]

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

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

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


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

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


begin...end   (2006-05-21 08:54:00) [9]

> 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 00:10:00) [10]

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

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

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


begin...end   (2006-05-20 22:48:00) [11]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо