SW_HIDE nie dziala (ShellExecute,winexec,CreateProcess)

0

Na poczatku powiem ze czytalem artykul http://4programmers.net/article.php?id=9, oraz przeszukiwalem okolo pol godzinny forum, niestety odpowiedzi nie znalazlem.

Wiec mam nastepujacy problem : Nie dziala mi otwieranie programu w trybie ukrytym SW_HIDE, ani przy shellexecute, ani przy winexec. Robie to w nastepujacy sposob :

 ShellExecute(Handle,'open','C:\WINDOWS\System32\calc.exe',nil,nil,SW_HIDE);

oraz

winexec('C:\WINDOWS\System32\calc.exe',SW_HIDE);

Aplikacja jest uruchamiana w trybie normalnym - a okno widoczne.
Dodam jezcze ze np. SW_SHOWMINIMIZED dziala mi bez problemu.
Ktos wie jaka moze byc tego przyczyna???

Pozdrawiam,
TrumpeT

0

shell execute zwróci Ci uchwyt programu, a potem to tylko funkcja ShowWindow, powinno zadziałać.

// a mi kiedyś zwracał, głowę bym dał [co] hmm, lol, widać coś mi się potegowało pod sufitem :P

0

shell execute zwróci Ci uchwyt programu

ShellExecute nie zwraca żadnego uchwytu programu!

Uruchom program.
Dokonaj enumeracji okien utworzonych przez ten program.
Wywołaj ShowWindow(Handle, SW_HIDE) dla okna "głównego".

zobacz: http://4programmers.net/Forum/viewtopic.php?id=56452&post=149863#149863

0

Dobra... mi chodzi oto zeby uruchomic ten program NIEWIDOCZNIE tak zeby nawet na sekunde nie pojawilo sie jego okno.A jesli robie

ShellExecute(Handle,'open',pchar(tempdir+'syntalk.exe'),nil,nil,SW_SHOWMINIMIZED);
H := FindWindow(nil,'syntalk');
showwindow(h,sw_hide);

To nie dziala w ogóle poniewaz jak sie domyslam program probuje zamknac okno zanim jeszcze zdazy sie odpalic program... i w rezultacie nic sie nie dzieje.
Probuje tez robic to w nastepujacy sposob:

ShellExecute(Handle,'open',pchar(tempdir+'syntalk.exe'),nil,nil,SW_SHOWMINIMIZED);
timer1.interval:=1;
timer1.enabled:=true;

procedure TForm1.Timer1Timer(Sender: TObject);
var
    H : THandle;
begin
    H := FindWindow(nil,'syntalk');
    showwindow(h,sw_hide);
end;

Ale wtedy okno otwieranego programu miga na ulamek sekundy, a mi zalezy na tym aby bylo W OGOLE nie widoczne. Aby otwieralo sie juz ukryte. Ma ktos jakis konkretny pomysl?

0

Uruchom program za pomocą ShellExecuteEx
w lpExecInfo.nShow ustaw SW_HIDE

Uruchom program za pomocą CreateProcess
w lpStartupInfo.wShowWindow ustaw SW_HIDE

0

No niestety. ShelExecuteEx tez mi cos nie chce dzialac. Skozystalem z Twojej procedury RunProcess2

procedure RunProcess2(const Exe, Params: string);
var
  dir: string;
  sei: TShellExecuteInfo;
  Handle : THandle;
  tempdir:string;
  Buff: array[0..MAX_PATH] of Char;

begin
  dir := ExtractFileDir(Exe);

  FillChar(sei, SizeOf(sei), 0);

  with sei do
  begin
    cbSize := SizeOf(sei);
    lpFile := PChar(Exe);
    lpParameters := PChar(Params);
    nShow := SW_HIDE;
    fMask := SEE_MASK_NOCLOSEPROCESS;
  end;

  if not ShellExecuteEx(@sei) then
  begin
    MessageBox(Handle, 'ShellExecuteEx Failed !', 'Error', MB_OK or MB_ICONEXCLAMATION);
    Exit;
  end;


end;

Zmienilem jak widac nShow na SW_HIDE. Ale nadal program uruchamia sie normalnie tak jak (SW_SHOW). Procedure wywoluje w ten sposob :

  RunProcess2(tempdir+'syntalk.exe','');

Czyli bez parametrow. Czemu nie dziala?????

Pozdro,
TrumpeT

0

Moze program w createparams ma wrzucone zeby pokazywal forme. albo forma jest tworzona pozniej, po tym jak sam program troche popracuje.

//dopisne
znajde plytke z Delphi, zainstaluje to cie wspomoge

0

Nie sadze bo takie same wyniki otrzymuje dla zwyklego calculatora (C:/WINDOWS/System32/calc.exe).

Pozdrawiam,
TrumpeT

0

Ale dla Notepad.exe już działa OK (Win 2000).

Sprawdzałem program napisany w Delphi, który w Create ma ShowWindow(Handle, SW_SHOWMAXIMIZED). Po uruchomieniu przez ShellExecute z lpExecInfo.nShow := SW_HIDE, jak i przez CreateProcess z lpStartupInfo.wShowWindow := SW_HIDE + lpStartupInfo.dwFlags := STARTF_USESHOWWINDOW, program jest widoczny (chociaż teoretycznie powinien być HIDE) !

I szczerze mówiąc nie wiem jak to pominąć !?

0

Masz racje notepad.exe z funkcji runprocess2 z tematu http://4programmers.net/Forum/viewtopic.php?id=42396&post=87644#87644 dziala z SW_HIDE, runprocess natomiast nie.

Jesli ktos bedzie znal rozwiazanie problemu dla np. calc.exe to bardzo prosze o info.

Pozdrawiam i dziekuje,
TrumpeT

0

Jesli ktos bedzie znal rozwiazanie problemu dla np. calc.exe to bardzo prosze o info.

var
    H : THandle;
begin
  H := FindWindow('Scicalc',nil); //oba rozwiazania zamiennie - gorne z klasa -  wielojezykowe - dolne po tekscie na belce okna
  //H := FindWindow(nil,'Kalkulator');
  showwindow(h,sw_hide);
end;

[browar]

moze pomyliles miejsce na klase i na captiona?? :)

0

Może spróbuj czegoś takiego:

procedure TForm1.Timer1Timer(Sender: TObject);
var
H:THandle;
begin
repeat
H:=FindWindow(nil, 'syntalk');
until H<>0;
ShowWindow(H, SW_HIDE);
end; 
0

Może spróbuj czegoś takiego:

procedure TForm1.Timer1Timer(Sender: TObject);
var
H:THandle;
begin
repeat
H:=FindWindow(nil, 'syntalk');
until H<>0;
ShowWindow(H, SW_HIDE);
end; 

ehhhh, zajekozak - normalnie jak nie znajdzie okna to bedzie wykonywal to w nieskonczonosc i potem jeszcze co interval timera bedzie dochodzic kolejna nieskonczona petla - wez pod uwage ze taki okno moze nie istniec :D

0

wez pod uwage ze taki okno moze nie istniec :D

Jeśli program jest uruchamiany, to okienko raczej powinno się stworzyć... ;-) Zakładając oczywiście, że nazwa i klasa okna zostały poprawnie wprowadzone. Można by najwyżej zrobić jakiś kilkusekundowy timeout.

0

Jesli ktos bedzie znal rozwiazanie problemu dla np. calc.exe to bardzo prosze o info.

var
    H : THandle;
begin
  H := FindWindow('Scicalc',nil); //oba rozwiazania zamiennie - gorne z klasa -  wielojezykowe - dolne po tekscie na belce okna
  //H := FindWindow(nil,'Kalkulator');
  showwindow(h,sw_hide);
end;

[browar]

moze pomyliles miejsce na klase i na captiona?? :)

Ale wtedy okno otwieranego programu miga na ulamek sekundy, a mi zalezy na tym aby bylo W OGOLE nie widoczne. Aby otwieralo sie juz ukryte. Ma ktos jakis konkretny pomysl?

Czytaj dokladniej poprzednie posty w temacie. To juz bylo poruszane :>

oże spróbuj czegoś takiego:

procedure TForm1.Timer1Timer(Sender: TObject);
var
H:THandle;
begin
repeat
H:=FindWindow(nil, 'syntalk');
until H<>0;
ShowWindow(H, SW_HIDE);
end;

Tez tak probowalem... ale to zawiesza program na pare sekund...a jak sie odwiesi to i tak nie ukrywa okna... to odpada

0

Ale wtedy okno otwieranego programu miga na ulamek sekundy, a mi zalezy na tym aby bylo W OGOLE nie widoczne. Aby otwieralo sie juz ukryte. Ma ktos jakis konkretny pomysl?
</quote>

ustaw interval timera na 1 millistekunde, a zeby nie spowalniac pracy - uruchom timer przed odplaleniem programu a azamknij jakies pol minuty po(dla zachowania bezpieczenstwa na slbych kompach).

0

Jeżeli mignięcie okienka SynTalka przy uruchamianiu byłoby do zaakceptowania, to nie ma sensu wprowadznia żadnych pętli, Timerów itp.
Wystarczy WaitForInputIdle.
Czyli tak:

Uruchamiasz program np. przez ShellExecuteEx

Wykonujesz WaitForInputIdle(ShellExecuteInfo.hProcess, INFINITE)
Przykład wykorzystania WaitForInputIdle: http://4programmers.net/Forum/viewtopic.php?id=49126&post=117452#117452

Znajdujesz okno SynTalka i ShowHindow(SynTalkWinHandle, SW_HIDE)

1 użytkowników online, w tym zalogowanych: 0, gości: 1