|
[ 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 
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|