Как я могу получить сообщение (WM_COPYDATA)?

Я посылаю сообщение WM_COPYDATA в мое приложение, которое имеет много форм, но я не могу его получить. Простое приложение с одной формой работает отлично.

У меня есть этот код в основной форме. Сообщение не получено

private
 procedure ReceiveMessage(var Msg: TWMCopyData); message WM_COPYDATA;
...
procedure TForm1.ReceiveMessage;
begin
  ShowMessage(PAnsiChar(Msg.CopyDataStruct.lpData));
end;

Я проверил дескрипторы приложения и основной формы. Так выглядит ручка:

Form1.Handle (main form) = 3348672
FindWindow result = Application.Handle = 7148290
FindWindowEx(Application.Handle,0,nil,nil) = 0 

Я прочитал здесь ( Delphi: Что такое Application.Handle?) В ответе Дона, что сообщения, отправленные дескриптору Application, перенаправляются в основную форму, но в моей ситуации этого не происходит. Как я могу получать сообщения? Почему сообщения не перенаправляются в основную форму?

Тестирование под Delphi XE8, Windows 10

2 ответа

Решение

За исключением того факта, что вы не предоставляете никакого реального кода, с которым вам нужна помощь, ваш вопрос, вероятно, неверный. Если я правильно понимаю, вы можете отправить сообщение, вы можете получить его, но вы отправляете его в неправильное место.

Если ваша форма имеет динамический заголовок, вы можете найти ее дескриптор следующим образом. Установите некоторую фиксированную часть заголовка "MyWindowTitle" и найдите это с помощью этой функции.

function FindFormHandle: HWND;
var
  NextHandle: HWND;
  NextTitle: array[0..260] of char;
begin
  Result:=0;
  NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);

  while NextHandle > 0 do
  begin
    GetWindowText(NextHandle, NextTitle, 255);

    if Pos('MyWindowTitle', NextTitle)>0 then
      Exit(NextHandle);

    NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
  end;
end;

Я нашел решение для получения сообщений: я установил заголовок главной формы равным Application.Title. Так что теперь FindWindow возвращает дескриптор главной формы. Но сейчас я не могу использовать динамический заголовок основной формы.

Другие вопросы по тегам