No właśnie jak to zrobić. Tak wiem, to mega lamerskie pytanie, ale już późna pora, a ja googlując za przykładami nie znalazłem I tak czasami bywa, że nie możemy wpaśc na najprostsze rozwiązania. I do tego chyba za słabo ogarniam Pointery. Bo według MSDN przy message LB_ADDSTRING LParam ma być wksźnikiem na null terminated string czyli może to byc dla Delphi PChar. Tak samo jak w WM_COPYDATA - to LParam jest wskaźnikiem na strukture CopyDataStruct czyli dla Delphi typ zwie się TCopyDataStruct i poniższy przykładowy kod działa ok:
function DlgProc(HwndDlg : HWND; Msg : UINT; wParam : wParam; lParam : lParam) : BOOL; stdcall;
var
P0 : ^TCopyDataStruct;
begin
result := false;
case msg of
WM_INITDIALOG :
begin
HDialog := HwndDlg;
SetWindowLong(HwndDlg, GWL_EXSTYLE, WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
end;
WM_CLOSE :
begin
HDialog := 0;
EndDialog(HwndDlg, 1);
Result := True;
end;
WM_COPYDATA :
begin
P0 := Pointer(lParam);
if P0.dwData = 4758 then
begin
TTSCommand(GlobalPlugident, CmdSpeak, PChar(P0^.lpData));
repeat
Sleep(100);
until TTSCommand(GlobalPlugident, CmdIsSpeaking, nil) = 0;
end;
end;
end;
end;
Jednak jak zrobić aby funkcja SMsg pokazująca string pokazała mi dodawany do ListBoxa element tekstowy czyli coś jak robimy dla TListBox Items.Add ale tutaj oczywiście w WinAPI? Bo kombinowałem już na wiele sposób różnie rzutując i definiując typy aby tylko się skompilowało, również bez GetMem, ale albo treśc w MessageBoxie była pusta albo były jakieś krzaki albo program się wysypywał. No to idę spać i z góry dziękuję za wszelkie podpowiedzi. I kajam się, że nie umiem sobie ogarnąc może tak banalnej sprawy albo wygooglować konkretnego przykładu w Delphi, bo wszędzie jest wysyłąnie komunikatu aby dodać nowy string, a nie ma sposobu jak pod Delphi go odebrać i przetworzyć.
function NewSendMessageA(AHWnd : HWND; UMsg : UINT;
AWParam : WPARAM; ALParam : LPARAM) : BOOL; stdcall;
var
P0 : ^PChar;
begin
if UMsg = LB_ADDSTRING then
begin
if (GetControlClassName(AHWnd) = MyListBox_Class_Name) then
begin
GetMem(P0, 100);
P0^ := PChar(ALParam);
SMsg(P0^);
end;
end;
Result := OriginalSendMessageA(AHWnd, UMsg, AWParam, ALParam);
end;
Chyba, że jedyną metodą nieco bardziej jeszcze lamerską niż moje pytanie jest postąpienie na około i zerowanie jakiegoś licznika później co komunikat zwiększania go o jeden i odczytywania innym funkcjami z komunikatmi do odczytu stringów takimi jak LB_GETTEXTLEN i LB_GETTEXT, ale chyba da się prościej. Tylko właśnie nie umiem ogarnąc samodzielnie jak i liczę na Was.