Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
FearDog
12 / 12 / 6
Регистрация: 19.08.2012
Сообщений: 78
#1

Работа с FindWindow и PostMessage: как надежно передавать данные между программами? - Delphi WinAPI

08.02.2018, 11:09. Просмотров 262. Ответов 8
Метки нет (Все метки)

Добрый день!
Осваиваю передачу сообщений между приложениями с использованием FindWindow и PostMessage.
Из одной программы с помощью PostMessage передаю сообщение другой программе следующим образом:
Delphi
1
2
3
4
5
6
const
  SX_MYMESSAGE = WM_USER+100;
 
...
PostMessage(FindWindow('TMainForm', nil),SX_MYMESSAGE,1,0);
...
Принимаю обработчиком формы MainForm:
Delphi
1
2
3
4
5
6
7
  private
    procedure MyMessage (var Message: TMessage); message SX_MYMESSAGE;
 
procedure TMainForm.MyMessage (var Message: TMessage);
begin
...
end;
Стал разбираться и не совсем понял принцип функции FindWindow:
Delphi
1
2
3
FindWindow('TMainForm', nil)                     // = 1511908
FindWindow(nil, PChar(Application.Title)         // = 5312082
FindWindow('TMainForm', PChar(Application.Title) // =0
Если я отправляю сообщение через PostMessage на хендл FindWindow('TMainForm', nil), то оно приходит в обработчик окна MainForm. Если программа открыта одна, то всё хорошо, но проблема возникает, когда я запускаю другую программу, где тоже главное окно имеет класс TMainForm, и все сообщения начинает принимать вторая программа.
Тут возникает первый вопрос: Как однозначно указать адресата, чтобы другие программы с подобными классами форм не перехватывали сообщения?

Второй вопрос: FindWindow(nil, PChar(Application.Title) - это хендл программы. Где принимать сообщения, отправленные этому хендлу?

Третий вопрос: Почему FindWindow('TMainForm', PChar(Application.Title) ничего не находит?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2018, 11:09
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с FindWindow и PostMessage: как надежно передавать данные между программами? (Delphi WinAPI):

Как передавать массив между тремя юнитами - Delphi
Есть три юнита. Первый-главный в форме с кнопками. Остальные вообще без формы. По отдельности дополнительные юниты работают, и "живут"...

Синхронизация между программами - Delphi
Представим ситуацию: есть 2 запущенных экземпляра одной программы. В этой программе есть какой-то набор данных, который должен...

Обмен данными между программами - Delphi
Подскажите, можно ли одновременно принимать данные из двух или более программ в третьей, например в одной программе цикл от 1 до 100, в...

Обмен данными между программами с помощью технологии DDE. - Delphi
Помогите ,пожалуйста,написать программу, которая будет передавать в Excel коэффициенты квадратного уравнения и получать обратно значения...

Как надежно защитить свою программу? - Delphi
Я думал давать пользователю его логин и пароль под которым он сможет входить в программу. Логин и пароль отправляются на сервак и там...

Работа со сторонними программами - Delphi
Всем привет. Уважаемые знатоки Вопрос вам Есть программа, которая при запуске проверяет наличие обновлений. В случае выхода новой...

8
northener
пофигист широкого профиля
3243 / 2295 / 496
Регистрация: 15.07.2013
Сообщений: 13,529
08.02.2018, 11:31 #2
TMainForm и Application это два разных окна.
0
FearDog
12 / 12 / 6
Регистрация: 19.08.2012
Сообщений: 78
08.02.2018, 11:52  [ТС] #3
northener, это что касается третьего вопроса?
Что касается первого вопроса, то я реализовал FindWindow('TMainForm', 'Реестр договоров'). Теперь другие приложения не перебивают Хендл, как это было с FindWindow('TMainForm', nil).

А как быть со вторым вопросом?
Второй вопрос: FindWindow(nil, PChar(Application.Title) - это хендл программы. Где принимать сообщения, отправленные этому хендлу?
Четвёртый вопрос по этой теме: если мы запустим одно и то же приложение дважды, то для окна с классом TMainForm и заголовком 'Реестр договоров' каждого приложения будет свой Хэндл. Если я отправлю сообщение на Хэндл FindWindow('TMainForm', 'Реестр договоров'), то его обработает только одно из запущенных приложений. Как сделать так, чтобы оба экземпляра приложения обработали моё сообщение?

И пятый вопрос: можно ли отправить сообщение всем приложениям?
0
NotBeginner
170 / 157 / 23
Регистрация: 22.02.2013
Сообщений: 1,770
Записей в блоге: 2
08.02.2018, 12:24 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от FearDog Посмотреть сообщение
Четвёртый вопрос по этой теме: если мы запустим одно и то же приложение дважды, то для окна с классом TMainForm и заголовком 'Реестр договоров' каждого приложения будет свой Хэндл. Если я отправлю сообщение на Хэндл FindWindow('TMainForm', 'Реестр договоров'), то его обработает только одно из запущенных приложений. Как сделать так, чтобы оба экземпляра приложения обработали моё сообщение?
создай цикл и пробегись по всем окнам - EnumWindows
Цитата Сообщение от FearDog Посмотреть сообщение
И пятый вопрос: можно ли отправить сообщение всем приложениям?
можно
0
FearDog
12 / 12 / 6
Регистрация: 19.08.2012
Сообщений: 78
08.02.2018, 12:35  [ТС] #5
Цитата Сообщение от NotBeginner Посмотреть сообщение
можно
А как?)))
0
NotBeginner
170 / 157 / 23
Регистрация: 22.02.2013
Сообщений: 1,770
Записей в блоге: 2
08.02.2018, 13:42 #6
цикл по всем окнам
и уже в нем делаешь что тебе надо)
0
FearDog
12 / 12 / 6
Регистрация: 19.08.2012
Сообщений: 78
09.02.2018, 06:13  [ТС] #7
Т.е. система сообщений такова, что она может быть адресована только одному окну?
0
NotBeginner
170 / 157 / 23
Регистрация: 22.02.2013
Сообщений: 1,770
Записей в блоге: 2
09.02.2018, 10:46 #8
FearDog, можно использовать в качестве параметра
HWND_BROADCAST - Сообщение помещается в очередях всех окон верхнего уровня в системе, включая заблокированные или невидимые не имеющие владельца окна, перекрывающие и выскакивающие окна. Сообщение не помещается в очередях дочерних окон.

Delphi
1
PostMessage(HWND_BROADCAST,SX_MYMESSAGE,1,0)

либо воспользоваться функцией BroadcastSystemMessage
0
northener
пофигист широкого профиля
3243 / 2295 / 496
Регистрация: 15.07.2013
Сообщений: 13,529
11.02.2018, 02:06 #9
Цитата Сообщение от FearDog Посмотреть сообщение
И пятый вопрос: можно ли отправить сообщение всем приложениям?
Тут уже были даны правильные ответы. Так что добавлю только одно. Сообщения Windows посылаются не приложениям, а окнам.
0
11.02.2018, 02:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2018, 02:06
Привет! Вот еще темы с ответами:

PostMessage+FindWindow+WM_KEYDOWN - C++ Builder
Такая проблема, при использовании PostMessage + FindWindow для нажатия клавиши(WM_KEYDOWN), не происходит выделения окна приложения. При...

Как передавать данные между модулями? - Visual C++
Как передавать данные между модулями? Допустим, у меня один *.cpp модуль связан с формой, а другой, в котором выполняются какие-нибудь...

Как передавать данные между окнами? - C# ASP.NET
Есть 2 окна(открытые из третьего). Как я могу передавать данные(туда-обратно) между этими двумя окнами без перезагрузки окон? Или же ,...

.NET 4.x Как передавать данные между формами - C#
Hi! Написал по сабжу статью (первоначально - себе в блог), но решил выложить тут. Полезнее будет, может кому и пригодится. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru