-1

多くのフォームを持つアプリケーションにメッセージ WM_COPYDATA を送信していますが、受信できません。フォームが 1 つの単純なアプリケーションは問題なく動作します。

このコードはメインフォームにあります。メッセージを受信して​​いません

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 

アプリケーションハンドルに送信されたメッセージはメインフォームにリダイレクトされるという Don's answer のhere( Delphi: What is Application.Handle? ) を読みましたが、私の状況ではそれは起こりません。メッセージを受信するにはどうすればよいですか? メッセージがメイン フォームにリダイレクトされないのはなぜですか?

Delphi XE8、Windows 10 でのテスト

4

2 に答える 2

1

助けが必要な実際のコードを提供していないという事実を除いて、あなたの質問はおそらく間違っています。私が正しいと仮定すると、メッセージを送信することはできますが、受信することはできますが、間違った場所に送信することになります。

フォームに動的なタイトルがある場合、次のようなハンドルを見つけることができます。タイトル「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;
于 2015-08-27T05:46:29.880 に答える
-3

メッセージを受信する解決策を見つけました。メイン フォームの Caption を Application.Title に設定しました。そのため、FindWindow はメイン フォームのハンドルを返します。しかし、現在、メインフォームの動的キャプションを使用できません。

于 2015-08-26T23:39:58.940 に答える