0

こんにちは私は私の問題を抱えていSendMessageます。

メッセージがフォームに届かないように見えます(フォームに登録されているメッセージを確認するためにWinspector Spyを使用しています)。これは、現在のフォームの正しいハンドルに送信していると確信しているため、奇妙です。

SendMessageはdll内にありますが、それとは何の関係もありません。

//sStr is just an input where i type in the Handler address;  
SendMessage(Integer(sStr),WM_COPYDATA, Integer(Handle),Integer(@copyDataStruct));

SendMessageは毎回0を返します。

受信側:

procedure WMCopyData(var Msg: TWMCopyData); message WM_CopyData;

procedure TMainForm.WMCopyData(var Msg: TWMCopyData);
var
 s : string;
begin
    s := PChar(Msg.CopyDataStruct.lpData);
    showmessage(s);
 //Send something back
    msg.Result := 2006;
end;

WM_CLOSEのような他のメッセージも試しました。なぜこれが失敗するのか誰か知っていますか?Delphi5を使用しています。

4

3 に答える 3

1

SendMessageの定義は

function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall;

更新しました

Msg = wm_copydataの場合:

  • 最初の引数は、データを受信するウィンドウへのハンドルです
  • 3番目の引数は、データを渡すウィンドウへのハンドルです。

最初の引数にsStrという名前を付けると、それはハンドルではなく文字列であると思います。

于 2010-10-06T15:48:57.563 に答える
1

問題はあなたが書くことができないということです

Integer(sStr)

整数(「12345」など)を表す文字列を整数(12345)に変換します。

使用する

StrToInt(sStr)

代わりは。

実際、技術的には、文字列は文字列ヘッダー+データへのポインタにすぎません。私はそれがInteger(sStr)単にそのポインタを返すと思います。(または、実際には、単にsStrを整数のように扱います)。

つまり、あなたはする必要があります

SendMessage(StrToInt(sStr), WM_COPYDATA, Handle, cardinal(@copyDataStruct));
于 2010-10-06T16:16:40.773 に答える
0

問題は、ウィンドウに名前などを使用しようとしていて、それが機能しないことだと思います。

代わりにこれを試してください:

var
  Wnd: HWnd;
begin
  Wnd := GetForegroundWindow(); // Assumes your target window is up front
  // Fill in CopyData structure here.
  SendMessage(Wnd, WM_COPYDATA, SomeWParamValue, Cardinal(@CopyDataStruct));
end;
于 2010-10-07T13:04:23.883 に答える