[ IgLo @ 04.04.2005. 20:14 ] @
Dali neko ima ideju zasto ovo ne radi kako treba. Program koji zelim da startujem se pokrene, ali nije minimizovan (moram da koristim CreateProcess - ne pomaze mi ShellExecute)

Code:

procedure TForm1.Button1Click(Sender: TObject);
Var
  X : Integer;
  ProcInfo: TProcessInformation;
  StartInfo: TStartupInfo;

Begin

            FillChar(ProcInfo, SizeOf(TProcessInformation), 0);
            FillChar(StartInfo, SizeOf(TStartupInfo), 0);
            StartInfo.CB := SizeOf(TStartupInfo);

            StartInfo.dwFlags := STARTF_USESHOWWINDOW;
            StartInfo.wShowWindow := SW_SHOWMINIMIZED;
            CreateProcess('D:\2\EXAMPLE\DialUpT.exe', Nil, Nil, Nil, FALSE, 0, Nil, Nil, StartInfo, ProcInfo );
end;


Probao sam da pokrenem i neki drugi program, isto se desava.
[ reiser @ 04.04.2005. 20:40 ] @
Samo stavi putanju do procesa kao drugi parametara - prvi neka ti bude nil.
[ Srki_82 @ 04.04.2005. 22:51 ] @
Program koji pokreces ne mora da bude minimizovan cak i ako postavis taj flag. Ja sam pravio neki instaler koji se uvek prikaze normalno cak i kada je minimize flag postavljen. Proces se pokrene minimizovan, ali u programu proveravam da li je prozor minimizovan i ako jeste ponovo ga prikazem tako da ako DialUpT.exe ne zeli da se minimizuje tesko ces ga naterati
[ IgLo @ 04.04.2005. 23:29 ] @
Citat:
Marko Paunovic: Samo stavi putanju do procesa kao drugi
parametara - prvi neka ti bude nil.


Nije to, probao sam i ranije posto sam u raznim primerima video da ljudi rade ovako kao sto si rekao.

Citat:
Srki_82: Program koji pokreces ne mora da bude minimizovan cak i ako postavis taj flag.


Da, znam, ali sto je najgore, program nema nista posebno sto mu ne bi dalo da se minimizuje, obicna forma sa par dugmica - ja ga kompajlirao, tako da nema nekih skrivenih stvari. A kao sto rekoh probao sam i sa drugim programima.

Sve u svemu, pored svih primera skinutih sa net-a koji izgleda rade svuda osim kod mene i 2 sata cackanja, uspeo sam da ga minimizujem, ali sam SW_SHOWMINIMIZED zamenio sa SW_SHOWMINNOACTIVE. Idiotizam, ali bar radi

Sada nastupa drugi problem, da vidimo da li neko ima resenje za ovo:

Kada sam konacno uspeo da pokrenem programe i sve ih minimizovao (svi se minimizuju u SystemTry) i na kraju ih ubio sa TerminateProcess, njihove ikonice ostaju u SystemTry-u dok preko njih ne prevucem misa. Imali neko ideju kako da uradim nesto tipa SystemTry.Refresh Nemojte mi samo reci da iz mog programa simuliram prevlacenje misa preko SysTray-a, mislim moze i tako, ali ja bih elegantnije
[ Srki_82 @ 04.04.2005. 23:36 ] @
Nemoj da pozivas TerminateProcess. Ta funkcija koliko znam ne dozvoljava procesu da oslobodi svu memoriju koju je zauzeo, da skine ikonice iz SysTray-a i slicno. Posalji poruku WM_QUIT prozoru koji hoces da zatvoris (PostMessage) ili ako bas moras da posaljes poruku odredjenom thread-u mozes koristiti PostThreadMessage.
[ IgLo @ 05.04.2005. 12:13 ] @
Pokusao sam sa PostMessage, neke programe zatvori a neke ne. Cak ne mogu ni da detektujem da li ih je zatvorio jer mi PostMessage za neke od programa koje ne zatvori vraca True a za neke False. Sto se tice PostThreadMessage, on mi ne zatvori ni jedan program. Inace, sto se tice PostMessage, i posle njega ostaju ikonice od programa koje je uspeo da zatvori . Mislim, mogao je Microsoft i malo vise da ga zakomplikuje... Sve bi bilo uredu da funkcija ExitProces (koja radi bas ono sto mi treba) moze kao parametar da primi Handle od procesa kao i TerminateProcess.
[ Srki_82 @ 05.04.2005. 17:07 ] @
Za divno cudo kod mene PostMessage sa WM_QUIT komandom radi za sve programe i iskljuce ikonice iz tray-a. Probao sam na Opera, Yahoo, MSN, ICQ Messenger, McAfee SC, Virtual CD 7, GetRight.
Za koje programe tebi nije radio kako treba ovaj pristup?
[ IgLo @ 05.04.2005. 18:52 ] @
Onda mora da ja negde gresim ali nemam pojma gde. U pitanju je 5 programa: SpamPal, FlashGet (on se jedini ugasi), AdMuncher, YahooPOPs i NeoBee Speedy.

Ako ima neko da mu nije tesko da pogleda ove dve procedure, meni su vec oci ispale i nemam ideja...

Code:

Procedure TMainForm.RunPrograms;

Var
  X : Integer;
  ProcInfo: TProcessInformation;
  StartInfo: TStartupInfo;

Begin
  With RunOnConnectForm.lv_Programs Do
    For X := 0 To Items.Count - 1 Do
      Begin
        If Items [x].Checked And FileExists (Items [x].Caption) Then
          Begin
            FillChar(ProcInfo, SizeOf(TProcessInformation), 0);
            FillChar(StartInfo, SizeOf(TStartupInfo), 0);
            StartInfo.CB := SizeOf(TStartupInfo);
            StartInfo.dwFlags := STARTF_USESHOWWINDOW;
            If UpperCase (Items [x].SubItems [1]) = 'YES' Then
              StartInfo.wShowWindow := SW_SHOWMINNOACTIVE
            Else
              StartInfo.wShowWindow := SW_SHOWNORMAL;
            CreateProcess(PChar (Items [x].Caption),
                          PChar (Items [x].Subitems [0]),
                          nil, nil, false,
                          NORMAL_PRIORITY_CLASS,
                          nil, nil,
                          StartInfo, ProcInfo);

            Items [x].SubItems [3] := IntToStr (ProcInfo.hProcess);

          End;
      End;
end { RunPrograms };

Procedure TMainForm.ClosePrograms;

Var
  X : Integer;
Begin
  With RunOnConnectForm.lv_Programs Do
    For X := 0 To Items.Count - 1 Do
      If Items [x].SubItems [3] <> '' Then
        Begin
          //TerminateProcess(StrToInt(Items [x].SubItems [3]), 0);
          PostMessage(StrToInt(Items [x].SubItems [3]), WM_QUIT, 0, 0);
          Items [x].SubItems [3] := '';
        End;

End { ClosePrograms };
[ Srki_82 @ 05.04.2005. 19:10 ] @
A sta imas u Items[X].SubItems[3]? Process handle, process ID, window handle, nesto cetvrto?
[ IgLo @ 05.04.2005. 20:24 ] @
Mozes videti u RunPrograms proceduri, tamo stavljam ProcInfo.HProces, a ProcInfo je definisan ovako (kopirano iz Win32 Developer Revefrence):

typedef struct _PROCESS_INFORMATION { // pi
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION;

Znaci Handle od procesa.
[ Srki_82 @ 06.04.2005. 00:36 ] @
Zato i ne radi PostMessage treba na ulazu da ima window handle, a ne process handle

P.S.
Citat:
Onda mora da ja negde gresim ali nemam pojma gde. U pitanju je 5 programa: SpamPal, FlashGet (on se jedini ugasi), AdMuncher, YahooPOPs i NeoBee Speedy.

Cudi me kako se FlashGet uopste ugasio!?
[ IgLo @ 06.04.2005. 09:08 ] @
Ahaaaaaaaaa.... Ne mogu da verujem. A jel znas kako da dobijem Handle od prozora aplikacije ako imam njen Process Handle? Pretrazio sam MSDN ali ne mogu da nadjem nista sto bi mi koristilo.
[ Srki_82 @ 06.04.2005. 16:08 ] @
Nisi mogao da nadjes nista sto ti odgovara jer tako nesto ni ne postoji :) Zato sam ti i spomenuo onu PostThreadMessage. Kada kreiras proces dobijes i id glavnog thread-a tog procesa. Sa AttachThreadInput spojis neki svoj thread koji ce poslati poruku sa tim glavnim thread-om zeljenog procesa. Tvoj thread posalje WM_QUIT i otkaci se iz glavnog thread-a i to je to.
Mada postoji laksi nacin (tako sam ja radio kad sam testirao WM_QUIT poruku). Ako znas koji prozor hoces da ugasis mozes da ga pronadjes sa FindWindow. Treba da znas naziv tog prozora ili njegovu klasu i ova funkcija ti vrati handle prozora.
[ IgLo @ 06.04.2005. 20:01 ] @
Hvala ti srki, mnogo si mi pomogao, uspelo je, ali nisam morao da radim sa AttachThreadInput, proradilo je kada sam ProcInfo.hProcess zamenio sa ProcInfo.dwThreadId i iskoristio PostThreadMessage. Da toliko budem slep pored ociju, a jos si me pitao ono "A sta imas u Items[X].SubItems[3]?", prosto ne mogu da verujem Ali nista zato, bar sam naucio da radim sa Thread-ovima posle silnog testiranja.
[ Srki_82 @ 06.04.2005. 22:47 ] @
Pazi stvarno moze i bez AttachThreadInput... da ne poverujes Ako ti se nekad desi da nece poruka da se posalje u neki thread prvo probaj da uradis attach pre nego sto pocnes da psujes i lupas kuciste i monitor
Drago mi je sto je sve proradilo