Zastanawiam się w jaki sposób można by było zrealizować przekazanie w komunikacie do drugiej aplikacji postępu tej pierwszej.
Standardowo do wysyłania komunikatów używam tego sposobu:
{Aplikacja odbierająca komunikat}
const
KOMUNIKAT_1 = WM_USER + 1234;
{
Kluczową sprawą jest określenie takiego identyfikatora, który nie będzie kolidował z innymi,
zarezerwowanymi już komunikatami.
Do stałej WM_USER należy dodać jakąś wartość, której górna granica wynosi 31 734.
}
type
TForm1 = class(TForm)
private
procedure KomunikatDoAplikacji(var Msg : TMessage); message KOMUNIKAT_1;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.KomunikatDoAplikacji(var Msg: TMessage);
begin
{Wartość zwrotna jako pozytywne odebranie komunikatu}
Msg.Result := 1;
//instrukcje do wykonania w ramach odebrania komunikatu
end;
{Aplikacja wysyłająca komunikat}
const
KOMUNIKAT_1 = WM_USER + 1234;
var
Form1: TForm1;
implementation
{$R *.dfm}
function FindWindowExt(Text: string): hWnd;
var
Han: hWnd;
cTitle: array [0..254] of Char;
sTitle: string;
begin
Han := FindWindow(nil, nil);
Text := AnsiLowerCase(Text);
while Han <> 0 do
begin
GetWindowText(Han, cTitle, 255);
sTitle := cTitle;
if cTitle = '' then
begin
Han := GetWindow(Han, GW_HWNDNEXT);
Continue;
end;
sTitle := AnsiLowerCase(sTitle);
Application.ProcessMessages;
if Pos(Text, sTitle) <> 0 then Break;
Han := GetWindow(Han, GW_HWNDNEXT);
end;
Result := Han;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Han: hWnd;
begin
Han := FindWindowExt('TYTUŁ_OKNA_APLIKACJI');
{Jeśli aplikacja zwróci wartość zwrotną 1 podaną w aplikacji odbierającej}
if SendMessage(Han, KOMUNIKAT_1, 2, 20) = 1 then ShowMessage('Komunikat przekazany!')
else ShowMessage('Błąd. Komunikat nie został przekazany!');
end;
Tym sposobem można według mnie wysyłać tylko proste informacje typu (akcja rozpoczęta/zakończona). Nie znam możliwości, aby w komunikacie przesłać zmieniającą się wartość, która pełniła by rolę informacji o postępie.
Jak to można wykonać ?