| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Обработка сообщений. |
| Автор: iddqd 7.3.2006, 13:40 |
| Программа к которой я подключаю совй плагин не умеет обрабатывать сообщения. Я хочу написать плагин, который бы делал это. Итоговая цель сделать примерно так, как в Winamp я нахожу окно и отправляю ему какое-либо сообщение и мне возвращает нужные мне данные, например длину текущего трека. Как мне реализовать такое самостоятельно если это вобще возможно сделать через плагин? Хотелось бы пример самой простой функции. |
| Автор: iddqd 7.3.2006, 14:13 | ||
Я бы тоже так сделали если бы мне объяснили как их ловить и отвечать на них. Собсна в этом и была суть вопроса. |
| Автор: Romikgy 7.3.2006, 14:34 |
| http://forum.vingrad.ru/index.php?showtopic=86452&hl= |
| Автор: iddqd 7.3.2006, 14:45 |
| Спасибо, но мне всё это сложно понять и разобрать, не силён я в С++ и WinAPI, вот если бы кто-нибудь написал простейший пример... :\ |
| Автор: Romikgy 7.3.2006, 14:53 |
| Упс ошибочка вышла насчет языка , щаз еще чет поищем А здеся учить это надо будет если хошь то что задумал написать. PS щаз пороюсь еще Добавлено @ 14:58 http://web.ict.nsc.ru/~cancel/delphi/realapp.html Добавлено @ 14:59 http://web.ict.nsc.ru/~cancel/delphi/msg.html Добавлено @ 15:00 http://www.firststeps.ru/mfc/winapi/win/apiwind1.html Добавлено @ 15:05 http://www.drkb.ru/ |
| Автор: Romikgy 7.3.2006, 15:09 |
| http://www.delphikingdom.com/asp/viewitem.asp?catalogid=169 |
| Автор: iddqd 7.3.2006, 16:39 | ||
| Спасибо за ссылки. Использую следующую функцию из рекомендованных ссылок.
Но код не рабочий. |
| Автор: Romikgy 7.3.2006, 16:45 | ||||
| А что шлешь? (код где?) Имхо надо юзать не а WM_USER+N (любое целое число) Добавлено @ 16:48 не увидел этого но лучше не 999, а WM_USER+999 ShowMessage , ненадо юзать , если хошь , то
Добавлено @ 16:50
|
| Автор: Romero 9.3.2006, 10:30 |
| Romikgy, подскажи, как лучше организовать следующее: Есть служба MyService.exe, есть обычная прога MyProg.exe (которая запускается непосредственно самой службой). Нужно с определенной периодичностью отсылать некоторое сообщение от MyService окну программы (хэндл известен из функции ее запуска, CreateProcess, например), ждать некоторое время и если не получен ответ (соответственно, в самой проге нужно реализовать прием и отправку сообщений), убивать процесс MyProg и запускать заново. Очень важный момент: вся эта махинация нужна не только для контроля присутствия в памяти MyProg.exe (если вдруг случайно вылетит), но и для выявления зависания (если прога запущена, но зависла, то она не должна отвечать на сообщения службы). Поступили предложения организовать это через pipe или через системные сообщения. Как лучше, проще и надежнее в данной ситуации? Если не сложно, |
| Автор: Romikgy 9.3.2006, 10:59 |
| Romero, имхо сначало надо читать правила один топик один вопрос! А по существу, я бы делал через мессаги, только если возможен неответ , то вместо SendMessage я бы юзал PostMessage, а подтверждение делал бы из сообщения юзал бы за и последнее , эти все мессаги юзают хендл окна, а это дает хендл процесса , это разные вещи!!! Если надо отсылать процессу тогда юзай PostThreadMessage |
| Автор: Romero 9.3.2006, 17:06 |
| Спасибо. Как отправлять сообщение я понял. Больше интересует, как их принимать лучше всего (если использовать PostThreadMessage)? Делать бесконечный цикл, который лезет в очередь сообщений? Или есть какое-то событие при поступлении сообщения? |
| Автор: Romikgy 9.3.2006, 17:49 |
| Имхо так , только надо в него еще внедрить обработку сообщений системы, чтоб приложение не висло |
| Автор: Romikgy 9.3.2006, 18:05 |
| http://forum.vingrad.ru/index.php?showtopic=61383&hl=postthreadmessage |
| Автор: Демо 9.3.2006, 22:02 |
| iddqd, Мне кажется, что для твоей задачи будет проще создать отдельный поток, в котором обрабатывать сообщения, посылаемые PostThreadMessage. организуется такой поток очень просто. Если необходимо, приведу пример. |
| Автор: Демо 9.3.2006, 22:17 | ||
Да вот простейший пример:
|
| Автор: Romero 12.3.2006, 09:25 | ||
Огромное спасибо! Работает. Только я разбил пример на 2 проги: одна отправляет, другая принимает.
Нужно ли делать обработку других сообщений, кроме WM_USER+1, WM_QUIT? Как мне организовать передачу ThrId от запущенной второй проги, если она зпускается из первой? При создании потока отправлять родителю сообщение тем же способом? Тогда как узнать хэндл родителя? И еще такой ньюанс: Моя программа, которая должна реагировать на отправленные ей сообщения, состоит из 2 форм. На второй форме выполняется некая процедура, которая может вызвать зависание всей проги (собственно, это я и хочу отлавливать). Так вот, если сделать отдельный поток, то при зависании он ведь наверняка сможет среагировать на сообщение, а мне это не нужно. Может, все-таки стоит мне сделать на одной из форм бесконечный цикл с проверкой? Тогда и с хэндлом будет проще - буду брать хэндл запускаемого приложения. |
| Автор: Romikgy 13.3.2006, 10:08 | ||||||
Нужно обрабатывать , только которые те нужны, ну чтоб можно было с прогой работать (типа выключить прогу) что это?
ни ля ля не понял
ты мож сказать конкретно че нужно то ? |
| Автор: Romero 15.3.2006, 07:15 |
| Как сообщить родителю ThrId из BeginThread, я имел ввиду. Объянсяю конкретно: Первая прогу зависает или "вылетает". Вторая прога ("родитель" первой, т.е. первая запускается из второй) должна периодически отправлять ей сообщения и принимать ответы. В случае отсутствия ответа выполнять некие действия. Но нужно учесть, что при зависании первой проги ответ прийти не должен (вот я и интересуюсь... если в варианте с созданием отдельного потока при зависании мессага дойдет без проблем, тогда плохо). Как мне этот механизм реализовать? Вариант с созданием отдельного потока меня не устраивает по причине, выделенной жирным, и потому, что я не знаю, как сообщить идентификатор запущенного потока из первой проги второй. |
| Автор: Демо 15.3.2006, 07:50 | ||
Да не ответ придти не должен, а определить нужно, что программа повисла. Не так ли? Дополнительный поток получает сообщение, проверяет доступность основного потока и отвечает в запросившую программу код состояния программы. Так как первая программа дочерняя по отношению ко второй и запусается из нее, то какие проблемы определить идентификатор потока? Известен дочерний процесс. Через него и получи ид доп. потока. |
| Автор: Romero 15.3.2006, 08:36 | ||||
Да.
Пример, плиззз. |
| Автор: Демо 15.3.2006, 13:35 | ||||
| Пожалуйста - Приложение1:
Приложение2:
|
| Автор: Romero 19.3.2006, 11:41 |
| Спасибо! |