Форум: "Начинающим";
Текущий архив: 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.02 c