Delphi7を使っています。
スレッドからメッセージをメインフォームに送信しているのですが、メインフォーム側で受け取ってくれません。
ブレークしながら確認すると、ちゃんと以下に記述している
SendMessageの所には来るのですが、WMCopyDataには来ないんです。
何が足りないのでしょうか?
'TMainForm' :メインフォームのクラス名
MSG_MAIN_MEMO:識別ID
Command :送信文字列
送信するとき
SendMsg('TMainForm', MSG_MAIN_MEMO, Command);
SendMsgの詳細
procedure TThread.SendMsg(ClassName: string; StrKind: Cardinal; Msg: string);
var
Cd: TCopyDataStruct;
Wnd:HWND;
begin
Wnd := FindWindow(PChar(ClassName), nil);
if (Wnd <> 0) then begin
Cd.dwData := StrKind;
Cd.cbData := Length(Msg) + 1; // +1はnull
Cd.lpData := StrAlloc(Cd.cbData);
try
StrCopy(Cd.lpData, PChar(Msg));
SendMessage(Wnd, WM_COPYDATA, WPARAM(Wnd), LPARAM(@Cd));
finally
StrDispose(Cd.lpData);
end;
end;
end;
と、こんな具合で、メインフォームの受け取り側は、プライベートで
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
を宣言し、
詳細は、
procedure TMainForm.WMCopyData(var Msg: TWMCopyData);
var
Buf: PChar;
begin
if (Msg.CopyDataStruct.dwData = MSG_MAIN_MEMO) then begin
Buf := StrALloc(Msg.CopyDataStruct.cbData);
try
StrCopy(Buf, Msg.CopyDataStruct.lpData);
MemoMsg(Buf);
finally
StrDispose(Buf);
end;
end
else begin
inherited;
end;
end;
すみません、OSはwin2000sp4です。
MemoMsg(Buf);
これは、メモにBufを表示しているだけです。
送り側は、
Cd.lpData := StrAlloc(Cd.cbData);
ではなく
Cd.lpData := PChar(Msg);
受け取り側は、
Buf := String(PChar(Msg.CopyDataStruct.lpData));
BufはString
で、いけるかと?
すみません、元々の方法で、使用していたフリーのコンポーネントを別なものに変更したら解決しました。
風来坊様、ありがとうございました。
ツイート | ![]() |