Как я могу получить сообщение (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 возвращает дескриптор главной формы. Но сейчас я не могу использовать динамический заголовок основной формы.