C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Передача сообщений, Пропадают сообщения
tsl
Отправлено: 18.02.2004, 14:39


Дежурный стрелочник

Группа: Участник
Сообщений: 65



Встретился с чрезвычайно неприятным эффектом ломающим весь алгоритм.

Два приложения обмениваются сообщениями. После выполнения приложением команды SendToBack() оно становится "глухим" к сообщениям.

Если его "поднять" мышкой, оно опять все слышит.

Что это может быть и как с этим бороться.
Doga
Отправлено: 20.02.2004, 15:18


Мастер участка

Группа: Участник
Сообщений: 575



Уточни, как ты находишь и хранишь Handle, которому ты посылаешь сообщения.
tsl
Отправлено: 22.02.2004, 13:43


Дежурный стрелочник

Группа: Участник
Сообщений: 65



Handle я не храню, а определяю: SendMessage(FindWindow(...)....);

В обработчике одного из сообщений находится this->SendToBack();

После выполнения этого оператора приложение не слышит ничего до того как его не подымешь мышкой.

Gedeon
Отправлено: 23.02.2004, 09:59


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (tsl @ 22/02/2004, 14:45)
SendMessage(FindWindow(...)....);

Почему не просто FindWindow(...) и приведите пожалуста полный код отправки и приема сообщения
Gedeon
Отправлено: 24.02.2004, 09:39


Ветеран

Группа: Модератор
Сообщений: 1742



Хорошо, код приводить не хочешь, а что говорит WinSight?
Doga
Отправлено: 24.02.2004, 14:57


Мастер участка

Группа: Участник
Сообщений: 575



Я почему спрашивал: у меня была похожая проблема. Окно (MDI Child)должно было мониторить процесс обработки данных, котррый запускался из внешней DLL. Интерфейс с DLL был организован с помощью сообщений. Всё работало пока окно было активно.Но как только ативизировалось другое MDI Child окно либо другое приложение,
окно монитора переставало получать соообщения, хотя DLL их посылало исправно. Handle этого окна передавлся в DLL как параметр инициализации процесса обработки.

Удолось победить это следующим образом. Вместо HWND ChildForm->Handle я передавал указатель на само окно монитора: TChildForm *ChildForm. А DLL уже вызывала ChildForm->Handle для передачи ему сообщения. И всё прошло! smile.gif
tsl
Отправлено: 29.02.2004, 15:59


Дежурный стрелочник

Группа: Участник
Сообщений: 65



Прошу прощения за молчание. По техническим причинам не мог выйти в интернет.

Никаких проблем с тем, чтоб привести код. Тем более, что изучал проблему на специально сделанных для этой цели отладочных программах.

Посылаю сообщение:
void __fastcall TForm1::SendToBackButtonClick(TObject *Sender)
{
SendMessage(FindWindow("TForm1","Приложение PMess2#"),
WM_MySendToBack, 0, 0);
}

Принимаю сообщение:
void __fastcall TForm1::OnMySendToBack(TMessage& Message)
{
this->SendToBack();
Message.Result = 0;
Label2->Caption = "Send to back";
}

Дальше программа глухая пока не подымешь (активизируешь) мышкой.
tsl
Отправлено: 29.02.2004, 16:14


Дежурный стрелочник

Группа: Участник
Сообщений: 65



Вообще-то, с проблеммой я справился, но очень криво.

Сконцентрировался на порядке вызова окон. Когда их не посылаешь назад, они глухими не становятся. Но здесь тоже прикольно получается. Оказывается, если экран полностью закрыть окном жестко привязав его к поверхности (StayOnTop), то это не означает, что данное окно находится в фокусе клавиатуры. Таким образом может получиться клавиатурная работа с окном за кадром. Приходится на время высвечивания не функционального окна блокировать клавиатурный обработчик окна за кадром. Синхронизация всего этого опять же через сообщения. Заморочено получается.

Doga, как я понял предлагает посылать сообщения главному окну приложения. Вроде так и делал. В приложении было всего одно окно. Или, что то не правильно понимаю?

Вернуться в Вопросы программирования в C++Builder