Bonjour,
Ma première question est idiote... mais j'ose la poser quand même
Objectif : Sous Windows, lancer un session de Libre Office dans une TForm.
Approche : je lance sWriter à partir de Lazarus en utilisant un TShellExecuteInfoA (sous Lazarus) ou un TShellExecuteInfo (Sous Delphi)
if ExecAndWait('swriter', '--norestore --nologo')
sWriter ouvre par son mécanisme propre, une fenêtre "Sans Nom 1".
Je cherche cette fenêtre (EnumWindows) et l'affecte à une TForm (SetParent) :
1 2 3 4
| then begin
EnumWindows(@EnumWindowsProc,0);
Windows.SetParent( fWriterHandle, Handle );
end; |
Un handle est attribué à l'ouverture de swriter (TShellExecuteInfoA.info), un processus long qui amène à l'affichage de la fenêtre que je repère par fWriterHandle : le code ici présent ne fonctionne pas du fait de la latence de l'ouverture de sWriter à l'apparition de la fenêtre "Sans nom 1". Donc je suis obligé de faire une boucle (avec un TTimer) sur mon EnumWindows qui fonctionne ainsi :
1 2 3
| if IsWindowVisible(wHandle) then
if pos('LibreOffice', sTitle ) > 0 then //Un peu bidouille mais je n'ai pas trouvé mieux (Toutes les fenêtres ouvertes par défaut contiennent "Libre Office" dans GetWindowText(wHandle, Title,...)
fWriterHandle := wHandle; |
En résumé : je lance sWriter. Celui-ci ouvre une fenêtre "Sans Nom 1" et c'est cette fenêtre que je veux voir apparaître dans une TForm. Le code que j'ai produit avec la boucle est fonctionnel mais je le trouve mal habile et cherche à l'améliorer.
Questions : Je me demandais si à partir de ExecAndWait, il était possible de détecter l'ouverture de la fenêtre Sans Nom 1 afin de lui affecter comme parent une TForm ou mieux, si dés le départ au lancement de sOffice il était possible de l'affecter à une nouvelle TForm, ce qui serait la solution idéale.
Remarque : l"approche est particulière à Libre Office. Rien à voir avec la gestion de NotePad dont l"ouverture de la fenêtre ne se fait qu"à partir d'un seul "programme". Pour Libre Office, ce n'est pas le cas : il utilise une succession de sous-programmes.
Cordialement. Gilles
PS : autre question idiote. J'ai hésité à poser également la question sur le forum Delphi. Dans les 2 cas, l'approche est identique. Il faut espérer qu'un utilisateur de Delphi lise le forum Lazarus ? Il n'y a pas de partie commune aux 2 forums alors que 90% du code Lazarus Windows LCL peut être compatible avec le code Delphi VCL ?
Partager