![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Повторный запуск программы [D6, 2000, XP]
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] и не вводи
> автора в заблуждение)
Это пустые придирки. Потом программа сама закроется.тем более что это один из возможных путей.
Автору нужно помогать советами а не смаковать его вопрос бессмысленно его критикуя