Blog. Just Blog

Способы отправки сообщений в Windows

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Способы отправки сообщений в Windows
Способы отправки сообщений в Windows

Любой разработчик программ под Windows наверняка так или иначе сталкивался с отправкой сообщений через функции SendMessage и PostMessage. При всей кажущейся простоте, у этих функций есть свои особенности, про которые будет полезно узнать, особенно начинающим программистам.

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

SendMessage немедленно отправляет сообщение другому окну, обращаясь к его оконной процедуре. Возвращает управление вызвавшему процессу только когда отправленное сообщение будет обработано целевым окном. В связи с этим, функцию SendMessage надо использовать осторожно, так как целевое окно может висеть, тем самым подвешивая основной процесс в ожидании результата.

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

SendNotifyMessage отправляет сообщение окну, но не дожидается ответа, сразу передавая управление дальше. Принципиальное отличие от PostMessage в том, что, как сказано в начале статьи, сообщение сразу отправляется основному обработчику окна. Эту функцию хорошо использовать для широковещательных рассылок сообщений окнам верхнего уровня.

SendMessageCallback отправляет сообщение окну, обращаясь к его оконной процедуре, но возвращает управление немедленно. Когда сообщение будет обработано целевым окном, система вызовет вашу callback-функцию и сообщит ей результат. Функция SendNotifyMessage аналогична функции SendMessageCallback с пустым callback-обработчиком.

PostMessage добавляет сообщение в очередь потока, связанного с указанным окном, после чего немедленно возвращает управление. Чаще всего используется для информирования процессов или эмуляции ввода, когда важна именно последовательность сообщений, но возвращаемый результат значения не имеет.

PostThreadMessage добавляет сообщение в очередь указанного потока, после чего немедленно возвращает управление. С помощью этой функции можно отправлять сообщения приложению, которое вообще не имеет окон, а обрабатывает сообщения через GetMessage.

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

Также стоит заметить, что в современных системах используется так называемая изоляция привилегий пользовательского интерфейса (UIPI). Она препятствует отправке сообщений процессами с более низким уровнем целостности процессам с болеем высоким уровнем целостности, за исключением очень специфического набора сообщений пользовательского интерфейса.

Поделиться ссылкой ВКонтакте
Просмотров: 2363 | Комментариев: 7

Метки: Assembler, окна
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (22.05.2020 в 14:11):
Если в VBS/VBA/WSH есть возможность вызвать WinAPI, то конечно можно использовать. Помнится, я рисовал HTA для конфигурации всякого железа, так вот там из JavaScript достаточно комфортно дергались функции WinAPI.

Библиотечка (x86):
https://www.upload.ee/files/11...rap.zip.html

И потом спокойно работают чудеса типа

Const WM_GETTEXT = &HD
Set Wrap = CreateObject("DynamicWrapper")
Wrap.Register "USER32.DLL", "GetForegroundWindow", "f=s", "r=l"
Wrap.Register "USER32.DLL", "SendMessage", "i=lllr", "f=s", "r=l"
Title = Space(100)
res = Wrap.SendMessage(Wrap.GetForegroundWindow(), WM_GETTEXT , 100, Title)
MsgBox Title

или подобное на JS:

var dw = new ActiveXObject("DynamicWrapper");
if (typeof dw=='undefined') {
    alert('FATAL ERROR!\n\nCan not create DynamicWrapper!');
    window.close();
}

dw.Register("USER32.DLL", "FindWindow", "i=ls","f=s", "r=l");
dw.Register("USER32.DLL", "SendMessage", "i=lllr", "f=s", "r=l");
var title=new Array(100).join(' ');

WM_GETTEXT=13;

res = dw.SendMessage(dw.FindWindow(0, "Zentimo xStorage Manager"), WM_GETTEXT , 100, title);
alert(dw.FindWindow(0, "Zentimo xStorage Manager"));
user (22.05.2020 в 13:52):
Странный вопрос,скорее всего, но возможно ли это использовать в VBS/VBA/WSH. Костылить в PowerShell вроде можно через CSharp Code
ManHunter (13.04.2020 в 23:59):
Ну если ресепшен, офис-менеджер(ы), секретутка, селекторная связь и система громкого оповещения зря грызут свою морковку, то да, приходится отдуваться ойтишнегам. Без капли юмора и сарказма.
nordpoint (13.04.2020 в 22:40):
Иногда руководство просит срочно разослать всем, кто в сети какое-нибудь сообщение. Причем срочно (быстрее, пока все не ушли!). Понимаю, что не по теме спрашивал, область та же: мы юзаем либо cmd адресно, либо унылый winsent, который по сути то же самое, но чуть лучше. Спасибо за помощь, сарказм и юмор. Всем удачи и здоровья ))
ManHunter (13.04.2020 в 09:38):
nordpoint, есть не просто гуй, а даже хардварное решение - телефон и телефонный справочник организации.
rtm (13.04.2020 в 02:10):
Цитатаnordpoint (12.04.2020 в 22:07):
Спасибо за статью! Есть ли удобный ГУИ для всего этого, чтобы по АД слать и тем, кто без АД в ЛАНе?

как говорил один знакомый после концерта: "ниче не понял. Но понравилось !"
Статья - не про отправку оповещений по lan , а про оконные сообщения (сообщения, отправляемые окну приложения).
По вашему вопросу : softpedia.com/downloadTag/LAN%20chat. Например, beebeep.net. C "интеграцией" в ad - поискать чуть дольше.
nordpoint (12.04.2020 в 22:07):
Спасибо за статью! Есть ли удобный ГУИ для всего этого, чтобы по АД слать и тем, кто без АД в ЛАНе?

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.09 сек. / MySQL: 4 (0.0147 сек.) / Память: 4.5 Mb
Наверх