Newsgroup: it.comp.lang.delphi
Titolo: Massimizzare la form principale di un processo

Salve, ho un problema.
Avrei la necessità di mettere la finestra principale di un processo,
di cui conosco il nome dell'eseguibile e l'handle, in primo piano
massimizzata, senza modificare il codice del processo, quindi non
posso inviare messaggi al processo. Sapete come posso risolvere il
problema?
Grazie in anticipo.
Alessandro

"Alessandro Vanni" <Alessan...@Interfree.it> ha scritto nel messaggio
news:aee5e36d.04060...@posting.google.com...

Ciao,
potrei suggerirti di cliccare col mouse sull'icona in alto a destra.
Rileggendo poi non capisco cosa intendi per modificare il codice del
processo.
Intuisco che non è un tuo programma e quindi hai solo l'handle della main
form (e tutti gli altri che puoi ricavare da esso).
Enigmatico è il fatto che tu non possa inviare messaggi ad un handle di
finestra (anche se non è un tuo software).
Comunque non hai bisogno di messaggi per massimizzare la finestra.
Nel Win32 SDK controlla le funzioni ShowWindow e SetWindowPlacement.
Ciao
Giuseppe

 Nel Win32 SDK controlla le funzioni ShowWindow e SetWindowPlacement.
La funzione ShowWindow() vuole come parametro l'handle della form
principale, però io ho soltanto l'handle del processo. Per ricavare
l'handle della form principale potrei usare la FindWindow(), però non
conosco la classe della finestra principale da passargli.
Preciso che questi processi li creo dal mio programma tramite la
CreateProcess().
Come posso risolvere il problema?
Alessandro

 conosco la classe della finestra principale da passargli.
[cut]
Ciao,
la cosa che mi viene al volo, senza consultare l'sdk, è quella di scorrere
tutte le TopLevelWindow con FindWindowEx o con EnumWindow. Ogni handle lo
tratti con GetWindowThreadProcessId per ricavare l'identificativo del
processo che confronterai con quello restituitoti in ProcessInformation di
CreateProcess. Fino a trovare l'handle della mainform che ti serve per
mandargli un ShowWindow.
Ma mettere le informazioni della finestra in Startupinfo di CreateProcess
non funziona?
Altro per ora non mi viene.
Ciao
Giuseppe

 conosco la classe della finestra principale da passargli.
Stai attento al fatto che, pur prevedendo Delphi una "form
principale", nel compilare un'applicazione Win32 questo concetto viene
perso.  Le form vengono trasformate in finestre e non esiste una
definizione di "finestra principale" sotto Windows.  Tutte le finestre
create da un particolare thread di un particolare processo hanno la
stessa importanza e priorità per il sistema operativo.  Che cosa hai
bisogno di fare nello specifico ?

 bisogno di fare nello specifico ?
Nella mia applicazione tramite la CreateProcess() creo alcuni processi
relativi ad alcune applicazioni MDI, dopo quando viene premuto un
bottone della mia applicazione si dovrebbe massimizzare la form
principale del processo associato, di cui conosco soltanto le
informazioni che ritornano dalla CreateProcess().
Avevo pensato di usare la ShowWindow(), però richiede la conoscienza
dell'handle della form da massimizzare (nel mio caso la form
principale).
Come posso risolvere il problema?
Saluti.
Alessandro

 non funziona?
In quale modo? Ricordo che il processo viene prima creato e poi
successivamente quando viene premuto un tasto deve essere
massimizzato.
Alessandro

 "Variabile required" alla chiamata della EnumWindows().
Ciao Adesso sto per andare via... prova cosě.
hLast:= 0;
Repeat
hLast:= FindWindowEx(0,hLast,nil,nil);
If hLast <> 0 Then
Begin
hPInstance:= GetWindowLong(hLast, gwl_hinstance);
If hPInstance = HandleCheCerchi Then
Begin
ShowWindow(HLast, quello chevuoi);
End;
End;
Until hLast = 0;
Ciao
Giuseppe


Facendo alcune modifiche al codice sopra ho ricavato questo:
var
  hLast: HWND;
  hPInstance: HWND;
  IDProcesso: HWND;
    begin
    hLast:= 0;
    Repeat
    hLast:=FindWindowEx(0,hLast,nil,nil);
    if(hLast<>0) then
        begin
        GetWindowThreadProcessId(hLast,@IDProcesso);
        if(ProcessInformation.dwProcessID=IDProcesso) then
            ShowWindow(HLast,SW_SHOW);
        end;
    until(hLast=0);
    end;
Il codice funziona, però trova tulle le finestre dei processi, quindi
come faccio a sapere qual è la main form del processo?
La EnumWindows() trova soltanto le Top-Level Window (non so se
Top-Level Window siano le main form dei processi), però come già detto
nel messaggio precedente,
in fase di compilazione visualizza il messaggio d'errore
"Variable required" alla chiamata della EnumWindows().
procedure Main();
  begin
  EnumWindows(@TrovaHandle,0);
  [...]
  end;
function TrovaHandle(Handle: THandle;Param: Cardinal): Boolean;
  begin
  [...]
  end;
Alessandro

...

Ho fatto qualche ulteriore modifica al codice sopra (nonostante non
sia riuscito a identificare la MainForm) e con W98 funziona abbastanza
bene, però con W2K, se il processo da visualizzare è ridotto a icona,
quando viene eseguita la ShowWindow() l'uso della CPU sale al 100%
fino a quando manualmente si ripristina il processo da visualizzare.
Questo è il codice modificato:
var
  hLast: HWND;
  hPInstance: HWND;
  IDProcesso: HWND;
 
    begin
    hLast:=0;
    repeat
        begin
        hLast:=FindWindowEx(0,hLast,nil,nil);
        if(hLast<>0) then
            begin
            GetWindowThreadProcessId(hLast,@IDProcesso);
            if(ProcessInformation_.dwProcessID=IDProcesso) then
                begin
                if(IsZoomed(hLast)=FALSE) then
                    begin
                    ShowWindow(hLast,SW_RESTORE);
                    ShowWindow(hLast,SW_SHOW);
                    end;
                BringWindowToTop(hLast);
                end;
            end;
        end;
    until(hLast=0);
    end;
Come posso risolvere il problema?
Grazie in anticipo.
Alessandro