Reputation: 364
Hi I'm having problems with my SendMessage
.
It seams like the message never reaches my form (I'm using Winspector Spy to see which messages that are registered in my form), which is strange because I'm shure I'm sending to the correct Handle for the current form.
The SendMessage is within a dll but that should not have any thing to do with it.
//sStr is just an input where i type in the Handler address;
SendMessage(Integer(sStr),WM_COPYDATA, Integer(Handle),Integer(@copyDataStruct));
SendMessage returns 0 every time.
On the receiving end:
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;
I have also tried other messages like WM_CLOSE. Do any one know why this fails? I'm using Delphi 5.
Upvotes: 0
Views: 872
Reputation: 125757
I think the problem is that you're trying to use the name or something for your window, and that won't work.
Try this instead:
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;
Upvotes: 0
Reputation: 109158
The problem is that you cannot write
Integer(sStr)
to convert a string representing an integer (e.g. '12345') to an integer (12345).
Use
StrToInt(sStr)
instead.
Indeed, technically, a string is only a pointer to the string header + data. I guess that Integer(sStr)
simply returns that pointer. (Or, actually, simply treats the sStr like an integer).
That is, you should do
SendMessage(StrToInt(sStr), WM_COPYDATA, Handle, cardinal(@copyDataStruct));
Upvotes: 1
Reputation: 27493
The SendMessage definition is
function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall;
Updated
For Msg = wm_copydata:
If you name the first argument sStr I assume it is not a handle but a string.
Upvotes: 1