Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2010, 12:42   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию Минимизация приложения при запуске через CreateProcess, как?

Привет всем!

Ситуация, в потоке создаётся CreateProcess который запускает указанный exe, так вот как через CreateProcess запустить программу в свёрнутом состоянии?

Последний раз редактировалось Человек_Борща; 28.08.2010 в 15:43.
Человек_Борща вне форума Ответить с цитированием
Старый 28.08.2010, 19:51   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,783
По умолчанию

Инопланетяне по секрету говорят, что не зря у нее есть параметр lpStartupInfo.
p51x вне форума Ответить с цитированием
Старый 28.08.2010, 20:40   #3
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

А может через ShellExecute тебе проще будет, чем через CreateProcess заполнять структуру чтобы спрятать окно
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 28.08.2010, 20:47   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Пробовал:
Код:
var
    SI: TStartupInfo;
...
begin
...
    while AppInfo.AppStart do
    begin
      ZeroMemory(@SI, SizeOf(SI));
      SI.cb := SizeOf(StartupInfo);
      DateSeparator := '/';
      Params := StringReplace(AppInfo.AppParamStr, '%cod_datetime%', FormatDateTime('mm/dd/yyyy hh:nn:ss', now), [rfReplaceAll, rfIgnoreCase]);
      if AppInfo.AppStartMin then
      begin
      SI.wShowWindow := SW_SHOWMINIMIZED;
      end else
      begin
      SI.wShowWindow := SW_SHOWNORMAL;
      end;
      CreateProcess(
        PChar(AppInfo.AppExe),
        PChar(AppInfo.AppParamStr), nil, nil,
        False, GetPriority(AppInfo.AppPriority), nil,
        PChar(ExtractFileDir(AppInfo.AppExe)), SI, PI);
      SetProcessAffinityMask(pi.hProcess, AppInfo.AppCPUAffinity);
      WaitForSingleObject(pi.hProcess, INFINITE);
      CloseHandle(pi.hProcess);
      CloseHandle(pi.hThread);
не работает, или я не так делаю?
Человек_Борща вне форума Ответить с цитированием
Старый 28.08.2010, 20:54   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

wShowWindow указывает приложению, как ему следует показать окно. Этот же параметр устанавливает lnk-ярлык к программе.

Проблема в том, что это указание программе. Т.е. следовать ему или нет - решает сама программа. Криво написанные программы его игнорируют.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 28.08.2010, 21:06   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,783
По умолчанию

Где поставленный флаг STARTF_USESHOWWINDOW??? Доки читать будете?

Цитата:
If dwFlags specifies STARTF_USESHOWWINDOW, this member can be any of the SW_ constants defined in Winuser.h. Otherwise, this member is ignored.

For GUI processes, wShowWindow specifies the default value the first time ShowWindow is called. The nCmdShow parameter of ShowWindow is ignored. In subsequent calls to ShowWindow, the wShowWindow member is used if the nCmdShow parameter of ShowWindow is set to SW_SHOWDEFAULT.
p51x вне форума Ответить с цитированием
Старый 28.08.2010, 21:08   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Читал доки по стартапинфо http://www.delphirus.com/article32.html
вот что получилось:
Код:
  public
    SI: TStartupInfo;
    PI: TProcessInformation;
    AppInfo: PAppInfo;
  end;

implementation

uses LogUnit,MainUnit;

function TAppThread.GetPriority(const Prior: Integer): Integer;
const
  BELOW_NORMAL_PRIORITY_CLASS = $4000;
  ABOVE_NORMAL_PRIORITY_CLASS = $8000;
begin
  case Prior of
    0: Result := IDLE_PRIORITY_CLASS; // Низкий
    1: Result := BELOW_NORMAL_PRIORITY_CLASS; // Ниже среднего
    2: Result := NORMAL_PRIORITY_CLASS; // Средний
    3: Result := ABOVE_NORMAL_PRIORITY_CLASS; // Выше среднего
    4: Result := HIGH_PRIORITY_CLASS; // Высокий
    5: Result := REALTIME_PRIORITY_CLASS; // Реального времени
  else
    Result := NORMAL_PRIORITY_CLASS; // Средний
  end;
end;

{ TAppThread }

procedure TAppThread.Execute;
var
  i: integer;
  Params: string;
  CODDatesepar: Char;
  HM:HWND;
begin
  repeat
    for i := 1 to 10 do
    begin
      Sleep(AppInfo.AppFirstStart * 100);
      if Terminated then
        Exit;
    end;
    hlrLog_AddtoAppLog('Запуск программы: ',AppInfo.AppName);
    while AppInfo.AppStart do
    begin
      ZeroMemory(@SI, SizeOf(SI));
      //FillChar(SI,SizeOf(SI),0);
      SI.cb := SizeOf(StartupInfo);
      DateSeparator := '/';
      Params := StringReplace(AppInfo.AppParamStr, '%cod_datetime%', FormatDateTime('mm/dd/yyyy hh:nn:ss', now), [rfReplaceAll, rfIgnoreCase]);
      SI.dwFlags:=STARTF_USESHOWWINDOW;
      if AppInfo.AppStartMin then
      begin
      SI.wShowWindow:=SW_SHOWMINIMIZED;
      end else
      begin
      SI.wShowWindow := SW_SHOWNORMAL;
      end;
        if Length(AppInfo.AppOtherCaption) > 0  then
        begin
        SI.lpTitle:=PChar(AppInfo.AppOtherCaption);
        end;

      CreateProcess(
        PChar(AppInfo.AppExe),
        PChar(AppInfo.AppParamStr), nil, nil,
        False, GetPriority(AppInfo.AppPriority), nil,
        PChar(ExtractFileDir(AppInfo.AppExe)), SI, PI);
но почему не работает?

Передаю ведь флаг смотреть в каком состоянии запускать программу.

p.s. тестирую на виндовском калькуляторе

edit:
http://programmersforum.ru/showthrea...055#post602055

яблоко от яблони не далеко упало..
Меня интересует параметр ilTittle он отвечает за заголовок программы, я правельно понял?
как задать его? Если там нужен указатель на структуру..
то как должна выглядеть структура?

у меня это так:
Код:
type
  {класс информации о программе}
  TAppInfo = record
    AppName: string; // Имя
    AppExe: string; // Полный путь до ехе
    AppParamStr: string; // Параметры закуска
    AppOtherCaption:string; //Заголовок другой.
    AppPriority: Integer; // Приоритет
    AppFirstStart: Integer; // Первый запуск через
    AppSecondStart: Integer; // Второй запуск через
    AppRestart: Integer;
    AppRestartInTime: TTime; // Перезапуск после ошибки
    AppStart: Boolean; // Стартовать после окея?
    AppCPUAffinity: Cardinal; // Запуск на ядре
    AppStartMin: Boolean; // Запуск свёрнутым
  end;
  PAppInfo = ^TAppInfo;
передаю в поток так:
Код:
    AppThr := TAppThread.Create(true);
    AppThr.AppInfo := @AppInfo;
    AppThr.Resume;
    Timer.Interval := AppInfo.AppRestart * 1000 * 60;
    Timer.Enabled := True;
как задать заголовок?

Последний раз редактировалось Человек_Борща; 28.08.2010 в 21:20.
Человек_Борща вне форума Ответить с цитированием
Старый 29.08.2010, 13:00   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Поможет кто-нибуть?
Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Проблема в том, что это указание программе. Т.е. следовать ему или нет - решает сама программа. Криво написанные программы его игнорируют.
(не даёт отправить сообщение без набранного текста, поэтому я его набираю тут...)
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 30.08.2010, 13:57   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Т.е. принудительно изменить заголовок программы ни как?
Человек_Борща вне форума Ответить с цитированием
Старый 30.08.2010, 15:22   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

В общем случае - нет.

В частном - зависит от программы.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу запустить серв через putty.exe WebMaster89 Помощь студентам 0 04.04.2010 07:57
Как запустить через Делфи *.exe файл Испанец91 Помощь студентам 2 20.02.2010 00:11
Помогите запустить программу Ellita Помощь студентам 14 21.12.2009 08:05
Запустить программу от имени... dr.Chas Win Api 3 21.08.2009 20:20
Как запустить программу Vadik(R) Паскаль, Turbo Pascal, PascalABC.NET 1 10.03.2008 16:04