Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как запустить программу невидимой


Автор: Ch0bits 28.4.2005, 22:33
Нужно запустить некую прогу prog.exe так, чтобы её не было видно.
Как это реализовать?
Пока я распологаю лишь этим кодом запускающим процесс в свёрнутом виде.

Код

procedure RunAndWaitApplication(App:string);
var
   si:TStartUpInfo;
   p:TProcessInformation;
begin
   FillChar(Si,SizeOf(Si),0);
   with Si do begin
      cb:=SizeOf(Si);
      dwFlags:=startf_UseShowWindow;
      wShowWindow:=sw_minimize;
   end;
   Createprocess(nil,pchar(App),nil,nil,false,
                           Create_default_error_mode,nil,nil,si,p);
   Waitforsingleobject(p.hProcess,infinite);
end;


Как бы сделать чтобы прога вообще не появлялась в TaskBar'е?

Автор: RA 28.4.2005, 22:53
Не проверял твой код но если он рабочий то wShowWindow:=sw_hide

но если что то можно добавить ShowWindow(p.hProcess, SW_HIDE);


Цитата(Vadim999 @ 28.4.2005, 22:33)
Как бы сделать чтобы прога вообще не появлялась в TaskBar'е?


В смысле из процессов скрыть?

Автор: Ch0bits 28.4.2005, 23:49
RAdmin
Это не помогает.

Когда я запускаю программу на экране её нет, но она появляется в свёрнутом виде в TaskBar'е. Мне приходится запускать её таким образом и ждать завершения порядка 300 раз. На это уходит много времени.
Проблема в том, что во время этого процесса нужно что-то делать в других программах, а появление задачи в TaskBar'е приводит к потере фокуса, миганию и перехода фокуса на TaskBar, что мешает использованию других программ.

Автор: <Spawn> 29.4.2005, 05:05
Используй параметр SW_HIDE, за место SW_MINIMIZE:

Код

procedure RunAndWaitApplication(App:string);
var
   si:TStartUpInfo;
   p:TProcessInformation;
begin
   FillChar(Si,SizeOf(Si),0);
   with Si do begin
      cb:=SizeOf(Si);
      dwFlags:=startf_UseShowWindow;
      wShowWindow := SW_HIDE;
   end;
   if Createprocess(nil,pchar(App),nil,nil,false,
                           Create_default_error_mode,nil,nil,si,p) then
   begin
      Waitforsingleobject(p.hProcess,infinite);
   end;
end;

Автор: Ch0bits 29.4.2005, 13:26
Всё равно не помогает. smile

Вот скриншот прилепил.
Добавлено @ 13:28
И почему картинка так сильно исказилась??? У меня Quality100 было!

Автор: Albinos_x 29.4.2005, 17:41
Код
...
uses
  Forms,
  Windows,
......
begin
  Application.Initialize;
  SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
  Application.CreateForm(TForm1, Form1);
......


Это в главный модуль...



Автор: Ch0bits 29.4.2005, 17:52
Этот код скрывает из TaskBar'а основную программу, а мне нужно скрыть дочернюю.
У меня на скриншоте показано появление дочерней программы.

Автор: Albinos_x 29.4.2005, 18:11
к этому добавляешь в свойстве формы Visible:=false (в инспекторе объектов)

Ни формы ни в таскбаре её не будет

Автор: Girder 29.4.2005, 18:20
Vadim999 твое сообщение о премировании я удалил. Енто не есть хорошо! Да и проблемма очень простая... smile

PS: Даю подсказку... smile ... :=CreateDesktop(...);

Код
//когда-то данный код был скрыт и посте его не видели :) PS: Сегодня уже не актуально... так что убираю скрытие.
procedure RunAndWaitApplication(App:string);
var
   si:TStartUpInfo;
   p:TProcessInformation;
   Desk:HDESK;
   s:string;
begin
   s:='NewDeskX';
   FillChar(Si,SizeOf(Si),0);
   Desk:=CreateDesktop(PChar(s),nil,nil,DF_ALLOWOTHERACCOUNTHOOK,DESKTOP_CREATEWINDOW,nil);
   si.lpDesktop:=PChar(s);
   with Si do begin
      cb:=SizeOf(Si);
      dwFlags:=startf_UseShowWindow;
      wShowWindow:=sw_show;
   end;
   Createprocess(nil,pchar(App),nil,nil,false,
                           Create_default_error_mode,nil,nil,si,p);
   Waitforsingleobject(p.hProcess,infinite);
   CloseDesktop(Desk);
   //...
end;

Автор: _hunter 29.4.2005, 18:22
Цитата
Этот код скрывает из TaskBar'а основную программу, а мне нужно скрыть дочернюю.

о... вот с этого нужно было начинать. если окон несколько по всем ним нужно будет пройтись... + чуть подробнее раскажи об этой программе ( что за дочерняя программа )

Автор: Albinos_x 29.4.2005, 18:26
возможно я не понял, нужно скрыть другую программу из твоей?

если да, то попробуй так, не проверял но возможно сработает:
Код
...
var myhwnd: HWND
...
myhwnd:=   {здесь передаёш дискриптор запускаемой программы}
...
SetWindowLong(MyhWnd,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
...

Автор: RA 29.4.2005, 18:35
Проверил, оказалось что в xp параметр SW_HIDE игнорируется при запуске файлов через (WinExec, ShellExecute, CreateProcess).


ЗЫ: ShowWindow(...);

Автор: Ch0bits 29.4.2005, 19:22
Ыыыы! Совсем запутался, я же не системщик.
На делфи со вчерашнего дня тока юзаю. Жизнь заставляет.

ShowWindow убираю нафиг!

Как получить HWND процесса?

Автор: RA 29.4.2005, 20:40
Мда, все обленились, приходится мне писать. smile
Вобщем всё теперь работает.
Код


procedure RunAndWaitApplication(App:string);
procedure HideApp(ProcessID: DWORD);
type
  PEnumWinRec = ^TEnumWinRec;
  TEnumWinRec = record
    ProcessID: DWORD;
  end;
var
  EnumWinRec: TEnumWinRec;

  function EnumWinProc(Wnd: HWND; Param: PEnumWinRec): BOOL; stdcall;
  var
    PID, TID: DWORD;
  begin
    TID := GetWindowThreadProcessId(Wnd, @PID);
    if PID = Param.ProcessID then
       ShowWindow(Wnd,SW_HIDE);
  end;

begin
  EnumWinRec.ProcessID := ProcessID;
  EnumWindows(@EnumWinProc, Integer(@EnumWinRec));
end;

var
   si:TStartUpInfo;
   p:TProcessInformation;
begin
   FillChar(Si,SizeOf(Si),0);
   with Si do begin
      cb:=SizeOf(Si);
      dwFlags:=startf_UseShowWindow;
      wShowWindow:=sw_minimize;
   end;

    if Createprocess(nil,pchar(App),nil,nil,false,Create_default_error_mode,nil,nil,si,p) then
    begin
        sleep(100);
        HideApp(p.dwProcessId);
    end;

Waitforsingleobject(p.hProcess,infinite);


end;



Автор: Ch0bits 29.4.2005, 21:13
Спасибо конечно...

НО конечная цель моего цензура - это чтобы программа уже запускалась скрытой, а у Вас она появляется и быстро исчезает. smile

Вы продвинулись дальше всех smile
М
 
Удалено. По моему... уже говорил что не хорошо выпрашивать код в обмен на поощрение. И без мата!

Автор: Ch0bits 30.4.2005, 09:36
to Moderator:
Не знаю как у Вас там... а у Нас в России это не матерное слово!
М
 
Не знаю как у тебя там... в России... а у нас в Москве енто мат.


Цитата(Vadim999 @ 29.4.2005, 21:13)
уже говорил

Незнаю кому Вы чего говорили, но только не мне.
М
 
См. выше


RAdmin
+1 smile Спасибки!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)