Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Повторный запуск программы [D6, 2000, XP]


Страницы:   1 2

Mishenka ©   (2006-11-28 11:20:00) 

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


term1t   (2006-12-05 17:41:00) [1]

как это раелизовать я не знаю (because too low skill :)), но это сделать можно 100%. Например Winamp, в нем есть опция "запускать больше 1 копии", если она отключена, то сколько не клацай - толку мало. И в процессах только 1 винамп.


Elen   (2006-12-05 15:59:00) [2]


> как например это делает TotalCommander ?

А как он делает?


Mishenka   (2006-12-05 15:43:00) [3]


> Elen ©   (05.12.06 15:39) [27]
> Куда б ты не "засунуть SetForegroundWindow" если в него передается 0 то ты и на экране получиш 0

В общем это верно. Но может всё-таки можно как-нибудь это сделать. как например это делает TotalCommander ?


Elen   (2006-12-05 15:39:00) [4]


> А может надо куда-нибудь засунуть SetForegroundWindow?

Куда б ты не "засунуть SetForegroundWindow"если в него передается 0 то ты и на экране получиш 0


Mishenka   (2006-12-05 15:16:00) [5]

А может надо куда-нибудь засунуть SetForegroundWindow?
Только пока не пойму куда...


Elen   (2006-12-05 14:05:00) [6]


> Mishenka

Например вместо того чтоб в трей запуздыривать закидывай форму за пределы экрана, а потом восстанавливай позицию. Тогда FindWindow Srabotayet.


Mishenka   (2006-12-05 13:40:00) [7]


> Elen ©   (05.12.06 12:09) [23]
> А ты проверь что возвращает  FindWindow('TfmMain', 'fmMain'); Есть подозрение что там 0


Действительно 0. А как тогда правильно сделать?


Elen   (2006-12-05 12:09:00) [8]


> Непонятно почему сообщение не отсылается, и окно не всплывает.

А ты проверь что возвращает  FindWindow('TfmMain', 'fmMain');. Есть подозрение что там 0


Mishenka   (2006-12-05 11:20:00) [9]

Отправляю сообщение из второй копии программы в первую

if not TryCreateMutex then
begin
  PrevWin := FindWindow('TfmMain', 'fmMain');
  SendMessage(PrevWin, WM_MYMESSAGE, 0, 0);
end


обрабатываю его:

type
 TfmMain = class(TForm)
  .........
 procedure WMMymessage(var Message: TMessage); message WM_MYMESSAGE;
 ..........
procedure TfmMain.WMMymessage(var Message: TMessage);
begin
  RestoreMainForm;
end;

procedure TfmMain.RestoreMainForm;
var I, J: Integer;
begin
 Application.ShowMainForm := True;
 ShowWindow(Application.Handle, SW_RESTORE);
 ShowWindow(Application.MainForm.Handle, SW_RESTORE);
 if not ShownOnce then
 begin
   for I := 0 to Application.MainForm.ComponentCount - 1 do
     if Application.MainForm.Components[I] is TWinControl then
       with Application.MainForm.Components[I] as TWinControl do
       if Visible then
       begin
         ShowWindow(Handle, SW_SHOWDEFAULT);
         for J := 0 to ComponentCount - 1 do
           if Components[J] is TWinControl then
             ShowWindow((Components[J] as TWinControl).Handle, SW_SHOWDEFAULT);
       end;
   ShownOnce := True;
 end;
end;


Окно не всплывает, при том что функция RestoreMainForm работает нормально. Непонятно почему сообщение не отсылается, и окно не всплывает.


Mishenka   (2006-11-30 14:57:00) [10]


> Array ©   (29.11.06 16:09) [18]
> на мютексе?
> второй флаг зделайте => была проведена попытка запуска
> второй копии проги...

Что-то я так и не разобрался как это сделать :((


MetalFan   (2006-11-29 22:44:00) [11]

> [19]
бред, а если в другой, абсолютно сторонней, программе также форма назвается?
в принципе до ума доведенное [1] покатит.


Chuk & Gek   (2006-11-29 21:44:00) [12]

program Project1;

uses
 Forms,Windows,
 Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

var
hwin:HWND;

begin
hwin:=FindWindow('TForm1','Form1');
if hwin<>0 then
 begin
  SetForegroundWindow(hwin);
  Application.Terminate;
 end;

 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.


Array   (2006-11-29 16:09:00) [13]


> Mishenka   (29.11.06 16:05) [17]


мереть - в смысле умереть, очепятка знаете ли

на мютексе?
ну так кто мешает читать мютекс в первой копии програмы по тому же принцыпу
У Вас ведь один фаг =>  запущена одна копия програмы
второй флаг зделайте => была проведена попытка запуска второй копии проги... или же втора должна посылать в первую сообщение какое нить


Mishenka   (2006-11-29 16:05:00) [14]


> Array ©   (28.11.06 14:57) [16]
> проверять не запущена ли програма, если да то мереть

В принципе удалось заставить мереть вторую копию программы, но никак не разберусь, как заставить в этот момент всплыть из трея окно первой копии программы???


Array   (2006-11-28 14:57:00) [15]


> Mishenka   (28.11.06 11:20) 

проверять не запущена ли програма, если да то мереть
http://narod.yandex.ru/cgi-bin/yandsearch?user=delphiworld&text=%E7%E0%EF%F3%F1%EA+%EF%F0%EE%E3%F0%E0%EC%EC+%EA%EE%EF%E8%FF&where=2


Anatoly Podgoretsky   (2006-11-28 14:48:00) [16]

> alex810  (28.11.2006 12:01:05)  [5]

Приведеный код не рабочий, по определению.


Сергей М.   (2006-11-28 12:48:00) [17]


> это ж нечестно


У нас с тобой разное понимание "честности" по этому поводу)
Засим позволь считать дальнейшую дискуссию на эту тему лишенной смысла.


Elen   (2006-11-28 12:43:00) [18]


> Возможных путей для достижения чего ? "Незапуска" второго
> экз-ра ?) Или условного завершения уже стартовавшего второго
> экз-ра ?)

Какая разница. Автору нужно чтобы второй запушенный экземпляр передал управление первому, закрывшись. Поскольку автор задал вопрос в "начинающих" то и следовательно про запуск процессов он не знает много. К чему буквоедство в его вопросе? Если что он потом переспросит, а-то сразу - "никак", это ж нечестно.


Сергей М.   (2006-11-28 12:35:00) [19]


> Потом программа сама закроется


Вот на этом и следовало в первую очередь заострить внимание автора.


> это один из возможных путей


Возможных путей для достижения чего? "Незапуска" второго экз-ра ?) Или условного завершения ужестартовавшего второго экз-ра ?)


Elen   (2006-11-28 12:27:00) [20]


> Где и как твоем коде (или в коде alex810) это достигается
> ?
> Да нигде и никак).. Сколько раз юзер жмакнет на иконке,
> столько процессов и будет стартовано) ... см. [6] и не вводи
> автора в заблуждение)

Это пустые придирки. Потом программа сама закроется.тем более что это один из возможных путей.
Автору нужно помогать советами а не смаковать его вопрос бессмысленно его критикуя


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо