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

Вниз

Как перехватить сообщения, посылаемые другому процессу?   Найти похожие ветки 

 
Руслан ©   (2006-02-27 13:47) [0]

В частности, интересуют сообщения WM_PAINT and WM_MOUSEMOVE другого окна


 
Crash Coredump ©   (2006-02-27 14:45) [1]

SetWindowsHookEx (WH_GETMESSAGE,...)


 
Руслан ©   (2006-02-27 14:49) [2]


> Crash Coredump ©   (27.02.06 14:45) [1]
> SetWindowsHookEx (WH_GETMESSAGE,...)

Поподробней можно? Я чайник, так сказать...


 
Crash Coredump ©   (2006-02-27 14:59) [3]


> Поподробней можно?


Можно. http://www.google.com


> ? Я чайник, так сказать...


Тогда стоит подумать - а браться ли за такую задачу вообще ?


 
Руслан ©   (2006-02-27 15:27) [4]


> Тогда стоит подумать - а браться ли за такую задачу вообще
> ?

Да все равно спасибо, я уже на sources.ru ищу ответ...
Можешь не отвечать


 
Eraser ©   (2006-02-27 15:41) [5]


> Руслан ©

Пример хука здесь можешь скачать
http://kladovka.net.ru/index.cgi?pid=list&rid=195
только хуки другие применяй.
для перехвата WM_PAINT используй WH_CALLWNDPROC, для WM_MOUSEMOVE используй WH_GETMESSAGE.


 
Руслан ©   (2006-02-27 15:58) [6]


> Eraser ©   (27.02.06 15:41) [5]

Спасибо, попробую.


 
Crash Coredump ©   (2006-02-27 16:05) [7]

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 это сообщение выбирается.


 
Eraser ©   (2006-02-27 16:17) [8]


> Crash Coredump ©   (27.02.06 16:05) [7]


> Значит, по GetMessage это сообщение выбирается.

GetMessage вообще то выбирает все сообщения, но отсылает в оконную процедуру только синхронные.
Но замечание хорошее. WM_PAINT может приходить как синхронно, так и асинхронно, AFAIK... так что нужно в обоих хуках его перехватывать.


 
Сергей М. ©   (2006-02-27 16:21) [9]


> Crash Coredump ©   (27.02.06 16:05) [7]


Ты бы хоть уточнил, то самое "другоге окно" создано неким кодовым потоком твоего процесса или чужого ?


 
Crash Coredump ©   (2006-02-27 16:29) [10]

Сергей М. ©   (27.02.06 16:21) [9]

Это наверное автору надо уточнять, а не мне.

Eraser ©   (27.02.06 16:17) [8]


> GetMessage вообще то выбирает все сообщения, но отсылает
> в оконную процедуру только синхронные.


Переведи пожалуйста, что ты написал. Синхронными называются сообщения, посылаемые по SendMessage и GetMessage их не выбирает, точнее, никаким образом не оповещает программу об их выборе.


> WM_PAINT может приходить как синхронно


В каком случае WM_PAINT приходит синхронно ?

(Я тебе открою секрет - это сообщение вообще никто не посылает при  работе системы)


 
Руслан ©   (2006-02-27 16:30) [11]


> Сергей М. ©   (27.02.06 16:21) [9]
>
> > Crash Coredump ©   (27.02.06 16:05) [7]
>
>
> Ты бы хоть уточнил, то самое "другоге окно" создано неким
> кодовым потоком твоего процесса или чужого ?


Другое окно создано кодовым потоком другого процесса, а не моего


 
Eraser ©   (2006-02-27 16:40) [12]


> Crash Coredump ©   (27.02.06 16:29) [10]


> Синхронными называются сообщения, посылаемые по SendMessage
> и GetMessage их не выбирает

а кто тогда выбирает? )

> точнее, никаким образом не оповещает программу об их выборе.

согласен.

> В каком случае WM_PAINT приходит синхронно ?

да почти всегда... например при вызове UpdateWindow или RedrawWindow.

> (Я тебе открою секрет - это сообщение вообще никто не посылает
> при  работе системы

точнее это сообщение отсылает только система.


 
Nick Denry ©   (2006-02-27 16:45) [13]

[10] Crash Coredump ©   (27.02.06 16:29)

В системе Windows циркулируют два типа сообщений: синхронные и асинхронные. Их различие – в приоритетах обработки. Функция ShowWindowA помещает в очередь сообщений приложеня синхронное сообщение WM_PAINT. Все синхронные сообщения попадают в очередь сообщений приложения и обрабатываются в порядке очередности.

Skip

Косвенно это можно выяснить, закомментировав в программе вызов функции UpdateWindowA, основным назначением корой является  посылка асинхронного сообщения WM_PAINT в оконную функцию. Асинхронные сообщения не ставятся в общую очередь приложения и сразу передаются в оконную функцию.

(с) В.И. Юров, Assembler. Учебник для ВУЗОВ 2-e издание, Питер, 2001


 
Nick Denry ©   (2006-02-27 16:47) [14]

стр. 393


 
Eraser ©   (2006-02-27 16:48) [15]


> Nick Denry ©   (27.02.06 16:45) [13]

всё правильно, но тов. В.И. Юров перепутал синхронные сообщения с асинхронными ))


 
Eraser ©   (2006-02-27 16:51) [16]


Посылка асинхронных сообщений в очередь потока
Когда с потоком связывается структура 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"


 
Nick Denry ©   (2006-02-27 16:53) [17]

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 зависит от параметров


 
Crash Coredump ©   (2006-02-27 17:01) [18]

Nick Denry ©   (27.02.06 16:45) [13]


> UpdateWindowA


> ShowWindowA


Таких функций в Windows нету. Соответственно, доверие к указанному источнику резко падает.

Eraser ©   (27.02.06 16:40) [12]

Да, ты прав. При вызове UpdateWindow (и только при нем) сообщение WM_PAINT посылается посредством SendMessage


 
Eraser ©   (2006-02-27 17:03) [19]


> Crash Coredump ©   (27.02.06 17:01) [18]


> Таких функций в Windows нету.

Опять мимо.


 
Nick Denry ©   (2006-02-27 17:06) [20]

[18] Crash Coredump ©   (27.02.06 17:01)

в заголовках TASM"a они именно так и описаны, хотя и A и W - одна функция.

Юров тут не при чем.


 
Crash Coredump ©   (2006-02-27 17:08) [21]

Eraser ©   (27.02.06 17:03) [19]


> Опять мимо.


Мимо чего, прости ?


 
begin...end ©   (2006-02-27 17:09) [22]

> Eraser ©   (27.02.06 17:03) [19]

Я извиняюсь, конечно, но их действительно нету. Есть ShowWindow/UpdateWindow.


 
Crash Coredump ©   (2006-02-27 17:10) [23]

Nick Denry ©   (27.02.06 17:06) [20]

То есть, если я в заголовках хрясма напишу ShowWindowZZZ, я имею полное право ссылаться на эту функцию при рассказе об обработке сообщений ?


 
Eraser ©   (2006-02-27 17:13) [24]


> begin...end ©   (27.02.06 17:09) [22]

угу.. в [19] наврал (


 
Eraser ©   (2006-02-27 17:15) [25]

вот уж этот Юров ;-P


 
Nick Denry ©   (2006-02-27 17:17) [26]

[23] Crash Coredump ©   (27.02.06 17:10)

Если авторы хрясма (кстати - у TASM"a - Borland) написали ShowWindowZZZ, которая при компиляции в хрясме будет преобразована в ShowWindow, а Вы пиишете книгу по хрясму, то ИМХО, имеете


 
Nick Denry ©   (2006-02-27 17:22) [27]

И чем, судя по SDK, WM_PAINT от UpdateWindow не подходит под асинхронные сообщения?


 
Crash Coredump ©   (2006-02-27 17:24) [28]

Nick Denry ©   (27.02.06 17:17) [26]

В таком случае я имею полное право предварять комментарием о том, что "это функции так описаны в хрясме", перед цитированием отрывка из книги по хрясму на форуме программистов Delphi. В Windows.pas эти функции описаны без суффиксов, да и откуда им, суффиксам, взяться, если эти функции к Unicode и Ansi безразличны...

"В системе Windows циркулируют два типа сообщений: синхронные и асинхронные. Их различие – в приоритетах обработки. Функция ShowWindowA помещает в очередь сообщений приложеня синхронное сообщение WM_PAINT"

И это учебник ? Бедные студенты ВУЗов...


 
Nick Denry ©   (2006-02-27 17:33) [29]

В таком случае я имею полное право

А я вас никак не ограничиваю в использовании этого права.


 
Nick Denry ©   (2006-02-27 17:37) [30]

да и откуда им, суффиксам, взяться, если эти функции к Unicode и Ansi безразличны...


Спрашивайте это у разработчиков ТАСМ"а, если вам интересно.

Хотя смысла ппредложения наличие суффикса не изменило.

И чем же фраза из учебника не верна?


 
Crash Coredump ©   (2006-02-27 17:46) [31]


> И чем же фраза из учебника не верна?



> Функция ShowWindowA помещает в очередь сообщений приложеня
> синхронное сообщение WM_PAINT"


Функция ShowWindow не помещает в очередь приложения синхронногоо сообщения WM_PAINT. Синхронные сообщения в очередь не помещаются, на то они и синхронные, чтобы проходить мимо очереди. Сообщение WM_PAINT в очереди не появляется, так как оно выбирается из очереди по наличию флага QS_PAINT, а не потому, что его туда кто-то поместил.


 
begin...end ©   (2006-02-27 17:53) [32]

> Nick Denry ©   (27.02.06 17:06) [20]

Я, опять же, извиняюсь, но о каких заголовках TASM"а идёт речь?


 
Eraser ©   (2006-02-27 17:54) [33]


> Crash Coredump ©   (27.02.06 17:46) [31]


> И чем же фраза из учебника не верна?

Скорее всего эти заголовочные файлы формировались не человеком, т.е. автоматически, на основе какого-то другово заголовочного файла.
Да это мелочь, то что лишнею букву приписали, плохо, то что определения синхронных и асинхронных сообщений перепутали.


 
NIck Denry ©   (2006-02-27 17:54) [34]

в очереди не появляется, так как оно выбирается из очереди

ну-ну


 
Polevi ©   (2006-02-27 18:10) [35]

LOL


 
Crash Coredump ©   (2006-02-27 18:12) [36]

NIck Denry ©   (27.02.06 17:54) [34]

Рихтера, который Джеффри, на сон грядущий почитай. Куда больше пользы.


 
Nick Denry ©   (2006-02-27 18:19) [37]

[36] Crash Coredump ©   (27.02.06 18:12)

Читаю переодически и от него не отказываюсь, впрочем как и от Саймона :)

[33] Eraser ©   (27.02.06 17:54)

то что определения синхронных и асинхронных сообщений перепутали

да уж...


 
Crash Coredump ©   (2006-02-27 18:28) [38]

Nick Denry ©   (27.02.06 18:19) [37]

А Саймона ни к чему - тоже словарь. Вот Петцольда, например, лучше.


 
Nick Denry ©   (2006-02-27 18:38) [39]

Без словаря труднозапоминаемые слова плохо пишутся.

З.Ы. Кончаем флуд



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

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

Наверх





Память: 0.56 MB
Время: 0.012 c
15-1145979821
Картинки
2006-04-25 19:43
2006.05.21
Скрин-шоты


3-1143359997
beglec
2006-03-26 11:59
2006.05.21
Проблема с инстяляцией на Win2003 Server


4-1140768419
Боян Георгиев
2006-02-24 11:06
2006.05.21
Получить иконы из system tray


2-1146385479
Mr tray
2006-04-30 12:24
2006.05.21
Иконка в трее


2-1146643356
Alex_C
2006-05-03 12:02
2006.05.21
Как получить CharSet шрифта





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