![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как перехватить сообщения, посылаемые другому процессу?
Руслан © (2006-02-27 13:47:00)В частности, интересуют сообщения WM_PAINT and WM_MOUSEMOVE другого окна
Eraser (2006-02-27 17:03:00) [21]
> Crash Coredump © (27.02.06 17:01) [18]
> Таких функций в Windows нету.
Опять мимо.
Crash Coredump (2006-02-27 17:01:00) [22]Nick Denry © (27.02.06 16:45) [13]
> UpdateWindowA
> ShowWindowA
Таких функций в Windows нету. Соответственно, доверие к указанному источнику резко падает.
Eraser © (27.02.06 16:40) [12]
Да, ты прав. При вызове UpdateWindow (и только при нем) сообщение WM_PAINT посылается посредством SendMessage
Nick Denry (2006-02-27 16:53:00) [23]The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT message to the window if the window's update region is not empty. The function sends a WM_PAINT message directly to the window procedure of the specified window, bypassing the application queue. If the update region is empty, no message is sent.
(c) MS Win32 SDK, function UpdateWindow
RedrawWindow зависит от параметров
Eraser (2006-02-27 16:51:00) [24]
Посылка асинхронных сообщений в очередь потока
Когда с потоком связывается структура THREADINFO, он получает свой набор очере дей сообщений. Если процесс создает три потока и все они вызывают функцию Create Window, то и наборов очередей сообщений будет тоже три Сообщения ставятся в очередь асинхронных сообщений вызовом функции PostMessage:
BOOL PostMessage( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
При вызове этой функции система определяет, каким потоком создано окно, иден тифицируемое параметром hwnd, Далее система выделяет блок пямяти, сохраняет в нем параметры сообщения и записывает этот блок в очередь асинхронных сообще ний данного потока. Кроме того, функция устанавливает флаг пробуждения QS_POST MESSAGE (о нем — чуть позже). Возврат из PostMessage происходит сразу после того, как сообщение поставлено в очередь, поэтому вызывающий поток остается в неведе нии, обработано ли оно процедурой соответствующего окна На самом деле вполне вероятно, что окно даже не получит это сообщение Такое возможно, если поток, создавший это окно, завершится до того, как обработает все сообщения из своей очереди.
...
Посылка синхронных сообщений окну
Оконное сообщение можно отправить непосредственно оконной процедуре вызовом SendMessage:
LRESULT SendMessage( HWNO hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
Оконная процедура обработает сообщение, и только по окончании обработки функция SendMessage вернет управление. Благодаря этому ее используют гораздо чаще, чем PostMessage или PostThreadMessage При переходе к выполнению следующей стро ки кода поток, вызвавший SendMessage, может быть уверен, что сообщение уже обра ботано.
Вот как работает SendMessage Если поток вызывает SendMessage для посылки со общения окну, созданному им же, то функция просто обращается к оконной проце дуре соответствующего окна как к подпрограмме. Закончив обработку, оконная про цедура передает функции SendMessage некое значение, а та возвращает его вызвавше му потоку.
(c) Джеффри РИХТЕР, "Создание эффективных WIN32-приложений
с учетом специфики 64-разрядной версии Windows"
Eraser (2006-02-27 16:48:00) [25]
> Nick Denry © (27.02.06 16:45) [13]
всё правильно, но тов. В.И. Юров перепутал синхронные сообщения с асинхронными ))
Nick Denry (2006-02-27 16:47:00) [26]стр. 393
Nick Denry (2006-02-27 16:45:00) [27][10] Crash Coredump © (27.02.06 16:29)
В системе Windows циркулируют два типа сообщений: синхронные и асинхронные. Их различие – в приоритетах обработки. Функция ShowWindowA помещает в очередь сообщений приложеня синхронное сообщение WM_PAINT. Все синхронные сообщения попадают в очередь сообщений приложения и обрабатываются в порядке очередности.
…
Skip
…
Косвенно это можно выяснить, закомментировав в программе вызов функции UpdateWindowA, основным назначением корой является посылка асинхронного сообщения WM_PAINT в оконную функцию. Асинхронные сообщения не ставятся в общую очередь приложения и сразу передаются в оконную функцию.
(с) В.И. Юров, Assembler. Учебник для ВУЗОВ 2-e издание, Питер, 2001
Eraser (2006-02-27 16:40:00) [28]
> Crash Coredump © (27.02.06 16:29) [10]
> Синхронными называются сообщения, посылаемые по SendMessage
> и GetMessage их не выбирает
а кто тогда выбирает? )
> точнее, никаким образом не оповещает программу об их выборе.
согласен.
> В каком случае WM_PAINT приходит синхронно ?
да почти всегда... например при вызове UpdateWindow или RedrawWindow.
> (Я тебе открою секрет - это сообщение вообще никто не посылает
> при работе системы
точнее это сообщение отсылает только система.
Руслан (2006-02-27 16:30:00) [29]
> Сергей М. © (27.02.06 16:21) [9]
>
> > Crash Coredump © (27.02.06 16:05) [7]
>
>
> Ты бы хоть уточнил, то самое "другоге окно" создано неким
> кодовым потоком твоего процесса или чужого ?
Другое окно создано кодовым потоком другого процесса, а не моего
Crash Coredump (2006-02-27 16:29:00) [30]Сергей М. © (27.02.06 16:21) [9]
Это наверное автору надо уточнять, а не мне.
Eraser © (27.02.06 16:17) [8]
> GetMessage вообще то выбирает все сообщения, но отсылает
> в оконную процедуру только синхронные.
Переведи пожалуйста, что ты написал. Синхронными называются сообщения, посылаемые по SendMessage и GetMessage их не выбирает, точнее, никаким образом не оповещает программу об их выборе.
> WM_PAINT может приходить как синхронно
В каком случае WM_PAINT приходит синхронно ?
(Я тебе открою секрет - это сообщение вообще никто не посылает при работе системы)
Сергей М. (2006-02-27 16:21:00) [31]
> Crash Coredump © (27.02.06 16:05) [7]
Ты бы хоть уточнил, то самое "другоге окно" создано неким кодовым потоком твоегопроцесса или чужого?
Eraser (2006-02-27 16:17:00) [32]
> Crash Coredump © (27.02.06 16:05) [7]
> Значит, по GetMessage это сообщение выбирается.
GetMessage вообще то выбирает все сообщения, но отсылает в оконную процедуру только синхронные.
Но замечание хорошее. WM_PAINT может приходить как синхронно, так и асинхронно, AFAIK... так что нужно в обоих хуках его перехватывать.
Crash Coredump (2006-02-27 16:05:00) [33]Eraser © (27.02.06 15:41) [5]
> для перехвата WM_PAINT используй WH_CALLWNDPROC
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if Msg.message = WM_PAINT then
Beep;
end;
Значит, по GetMessage это сообщение выбирается.
Руслан (2006-02-27 15:58:00) [34]
> Eraser © (27.02.06 15:41) [5]
Спасибо, попробую.
Eraser (2006-02-27 15:41:00) [35]
> Руслан ©
Пример хука здесь можешь скачать
http://kladovka.net.ru/index.cgi?pid=list&rid=195
только хуки другие применяй.
для перехвата WM_PAINT используй WH_CALLWNDPROC, для WM_MOUSEMOVE используй WH_GETMESSAGE.
Руслан (2006-02-27 15:27:00) [36]
> Тогда стоит подумать - а браться ли за такую задачу вообще
> ?
Да все равно спасибо, я уже на sources.ru ищу ответ...
Можешь не отвечать
Crash Coredump (2006-02-27 14:59:00) [37]
> Поподробней можно?
Можно. http://www.google.com
> ? Я чайник, так сказать...
Тогда стоит подумать - а браться ли за такую задачу вообще ?
Руслан (2006-02-27 14:49:00) [38]
> Crash Coredump © (27.02.06 14:45) [1]
> SetWindowsHookEx (WH_GETMESSAGE,...)
Поподробней можно? Я чайник, так сказать...
Crash Coredump (2006-02-27 14:45:00) [39]SetWindowsHookEx (WH_GETMESSAGE,...)