Не програмистъ. Сильно прошу не бить (если только чуть).
Кратко:
Не могу разобраться как получить сообщение от SendMessage;
Код почти полная копипаста:
Отправитель:
procedure TForm1.Button1Click(Sender: TObject);
var
CDS: TCopyDataStruct;
str:string;
begin
str := 'message1';
CDS.dwData := 1;
CDS.cbData := Length(str) + 1;
GetMem(CDS.lpData, CDS.cbData);
StrPCopy(CDS.lpData, AnsiString(str));
SendMessage(FindWindow(nil, 'Receiver'),
WM_COPYDATA, Handle, Integer(@CDS));
FreeMem(CDS.lpData, CDS.cbData);
end;
Получатель:
procedure TForm1.WMCopyData(var MessageData: TWMCopyData);
var
s:string;
begin
if MessageData.CopyDataStruct.dwData = 1 then
begin
s := PAnsiChar((MessageData.CopyDataStruct.lpData));
Label1.Caption:=s;
// ShowMessage(S);
MessageData.Result := 123;
end
else
MessageData.Result := -321;
end;
И получатель никак не реагирует, ничего не меняет, вообще не входит в данную процедуру.
FindWindow(nil, 'Receiver')
Работает корректно и находит нужное окно.
Например команды
SendMessage(receiverHandle, WM_LBUTTONDOWN, 300,300);
SendMessage(receiverHandle, WM_LBUTTONup, 300,300);
SetWindowPos(receiverHandle, HWND_BOTTOM, 1, 1, 20, 20, swp_nosize);
Вполне себе успешно перемещают нужное окно получателя или кликают по нему.
Если чуть подробнее, может подскажите более корректное решение:
Есть программа (оболочка), которая запускает множество расчетных одинаковых подпрограмм (~100), но так сразу 100 положит любой компьютер, запускать надо по "N" штук, потому надо отслеживать сколько программ работает в текущий момент и запускать новые по мере закрытия старых, потому завершившие работы программы посылают сообщение с идентификатором (который получили при запуске) о окончании работы и закрываются.
С передачей сообщений никогда ранее дела не имел, потому - темный лес.
Можно, конечно, отслеживать количество запущенных программ, но это неудобно в случае если запустить расчетную программу вручную (что тоже бывает).