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 для передачи ему сообщения. И всё прошло!
|
|
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, как я понял предлагает посылать сообщения главному окну приложения. Вроде так и делал. В приложении было всего одно окно. Или, что то не правильно понимаю? |
|