Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 14 odgovora
  • 4.957 pregleda

Najnovija ↓

CreateProcess problem 04.04.2005. u 21:14 · pre 262 meseca #1
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.
Re: CreateProcess problem 04.04.2005. u 21:40 · pre 262 meseca #2
Samo stavi putanju do procesa kao drugi parametara - prvi neka ti bude nil.
Re: CreateProcess problem 04.04.2005. u 23:51 · pre 262 meseca #3
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 ;)
Potpis
Play Store
Re: CreateProcess problem 05.04.2005. u 00:29 · pre 262 meseca #4
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 :)
Re: CreateProcess problem 05.04.2005. u 00:36 · pre 262 meseca #5
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.
Potpis
Play Store
Re: CreateProcess problem 05.04.2005. u 13:13 · pre 262 meseca #6
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.
Re: CreateProcess problem 05.04.2005. u 18:07 · pre 262 meseca #7
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?
Potpis
Play Store
Re: CreateProcess problem 05.04.2005. u 19:52 · pre 262 meseca #8
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 };
Re: CreateProcess problem 05.04.2005. u 20:10 · pre 262 meseca #9
A sta imas u Items[X].SubItems[3]? Process handle, process ID, window handle, nesto cetvrto?
Potpis
Play Store
Re: CreateProcess problem 05.04.2005. u 21:24 · pre 262 meseca #10
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.
Re: CreateProcess problem 06.04.2005. u 01:36 · pre 262 meseca #11
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!?
Potpis
Play Store
Re: CreateProcess problem 06.04.2005. u 10:08 · pre 262 meseca #12
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.
Re: CreateProcess problem 06.04.2005. u 17:08 · pre 262 meseca #13
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.
Potpis
Play Store
Re: CreateProcess problem 06.04.2005. u 21:01 · pre 262 meseca #14
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.
Re: CreateProcess problem 06.04.2005. u 23:47 · pre 262 meseca #15
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 :)
Potpis
Play Store
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme