2015-01-29 5 views
1

Я нахожусь в процессе портирования приложения для Windows VCL для Windows, FMX (FireMonkey) в Delphi XE7, и застрял на этом одном вопросе ...Получать сообщения WM_COPYDATA в форме Firemonkey?

Как вы получаете сообщения, такие как WM_COPYDATA на FireMonkey форме ?

У меня есть procedure WMCopyData(var msg: TWMCopyData); message WM_COPYDATA; в моей части protected, но сообщение так и не получено. Идентичный код в форме VCL отлично работает. Я понимаю, почему это не работает (FMX не использует петли сообщений Windows?), Не уверен, что с этим делать.

ответ

0

FMX на Windows действительно полагается на цикл сообщений Windows. Но архитектура не поддерживает доставку сообщений с использованием ключевого слова message.

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

Лучший способ обойти эту проблему, а также решить вашу проблему с FMX - это создать окно, посвященное задаче получения этих сообщений. Если вы управляете созданием окна, вы можете обеспечить, чтобы окно проживало столько, сколько вам нужно, и не подлежит повторному созданию окна VCL.

На платформе Windows вы можете сделать это, позвонив по телефону AllocateHWnd с блока System.Classes. Конечно, это зависит от Windows, но тогда WM_COPYDATA - это Windows, поэтому это не будет проблемой для вас.

+1

Нет никаких указаний на то, что код VCL здесь * flaky *, потому что у вас нет указаний на то, как он находит дескриптор, которому отправляется WM_COPYDATA. Если он извлекается с помощью 'FindWindow' перед отправкой сообщения, нет ничего плохого в этом; нет причин, чтобы воссозданное окно было проблемой, и ничего * сомнительного * об этом. –

+0

@KenWhite Это не так. Повторное создание окна может произойти между возвратом «FindWindow» и отправкой сообщения в это окно. –

+0

Уверен, что может. И между вызовом FindWindow и отправляемым сообщением может прибыть Armageddon. Если вы используете WM_COPYDATA для связи между приложениями, вы обычно отправляете сообщение, а затем, если вы не получите ответ в течение разумного времени, вы просто отправляете его снова. Тонкий шанс неудачи в редких обстоятельствах не квалифицируется как * flaky * или * dubious *, IMO. –

Смежные вопросы