Ten tydzień to same niespodzianki wczoraj natknąłem się na ciekawą rzecz, niestety mój poziom wiedzy nie potrafi tego rozwiązać :)
Podczas startu tworzone są dwie formy
Application.CreateForm(TMainForm, MainForm); //Główna
Application.CreateForm(TTasks, Tasks); //Visible = False
Teraz na formie głównej jest przycisk który uruchamia wątek a ten wysyła komunikat:
var
hwnd: THandle;
begin
hwnd := SendMessage(FindWindow('TTasks', 'Tasks'), WM_AddTask, NativeUInt(Self), 0));
end;
Komunikat dociera i wykonywana jest poniższa procedura
procedure TTasks.AddTask(var Msg: TMessage); WM_USER + 1;
var
T: TFrame;
begin
T := TFrame.Create(nil);
T.ObjectOwner := TObject(NativeUInt(Msg.WParam));
T.Parent := Self; // Tutaj następuje zmiana Handle z oczywistych względów
Msg.Result := T.Handle; //Tutaj zwracana jest "niby" prawidłowa wartość handle
end;
Teraz wracamy ponownie do wątku gdzie ten po wykonaniu określonych zadania wysyła no taki komunikat do wcześniej stworzonej ramki:
PostMessage(hwnd, WM_SetTaskMarquee, 0, 0);
I tu pojawia się problem. Jeżeli poczekam ok 20 sekund po włączeniu aplikacji kod zazwyczaj działa ale od razu po włączeniu już nie. Na ramce dałem timer1 z kodem
label1.caption := inttotstr(self.handle);
I wartości THandle czasami są równe a czasami nie, mało tego raz handle ma jedną wartość a po chwili się zmienia. Próbowałem wywoływać procedure HandleNeeded ale to nic nie daje.
Pytanie brzmi: Jak uzyskać prawidłowy uchwyt nie wyświetlając formy?