Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];

Вниз

Повторный запуск программы   Найти похожие ветки 

 
Mishenka   (2006-11-28 11:20) [0]

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


 
alex810 ©   (2006-11-28 11:53) [1]

Не знаю может подойдет. Могу еще накидать.


var
 MutexHandle: THandle;
var
 UniqueKey: string;

function IsNextInstance: BOOLEAN;
begin

 Result := FALSE;

 MutexHandle := 0;
 MutexHandle := CREATEMUTEX(nil, TRUE, UniqueKey);
 if MutexHandle <> 0 then
 begin
   if GetLastError = ERROR_ALREADY_EXISTS then
   begin
     Result := TRUE;
     CLOSEHANDLE(MutexHandle);
     MutexHandle := 0;
   end;
 end;
end;

begin

 CmdShow := SW_HIDE;
 MessageId := RegisterWindowMessage(zAppName);
 Application.Initialize;
 if IsNextInstance then
   PostMessage(HWND_BROADCAST, MessageId, 0, 0)
 else
 begin
   Application.ShowMainForm := FALSE;
   Application.CreateForm(TMainForm, MainForm);
   MainForm.StartTimer.Enabled := TRUE;
   Application.Run;
 end;
 if MutexHandle <> 0 then
   CLOSEHANDLE(MutexHandle);
end.



В MainForm  необходимо вставить обработчик внутреннего сообщения


procedure TMainForm.OnAppMessage(var M: TMSG; var Ret: BOOLEAN);
begin
 if M.Message = MessageId then
 begin
   Ret := TRUE;
   // Поместить окно наверх !!!!!!!!
 end;
end;

initialization
 ShowWindow(Application.Handle, SW_Hide);
end.





 
Сергей М. ©   (2006-11-28 11:58) [2]


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


Никак.


 
ЮЮ ©   (2006-11-28 11:59) [3]

a UniqueKey не мешало бы чего-нибудь действительно уникальное присвоить :)


 
Elen ©   (2006-11-28 12:00) [4]


>
>  [2] Сергей М. ©   (28.11.06 11:58)
>
> > Как сделать, чтоб при попытке её повторного запуска, она
>
> > не запускалась второй раз
>
>
> Никак.

Почему никак?


 
alex810 ©   (2006-11-28 12:01) [5]

Еще на запрет повторного запуска

program SlideShow;
Forms, Windows,
slide in "slide.pas1 {Forml};
80 Глава 4
I$R *.resl
var pbuff:array[O..127] of char; {буфер для текста)
var dWin: HWnd; {дескриптор!
var st:string; (вспомогательная строка)
begin
Application.Initialize;
Application.Title := "SlideShow1;
dWin:= GetWindow(Application.Handle, GW_HWNDFIRST);
while dWin <> 0 do
begin
if (dWin <> Application.Handle) and
{собственное окно игнорируем)
(GetWindow(dWin, GW_OWNER) = 0) and
{дочерние окна игнорируем)
(GetWindowText(dWin, pbuff, sizeof(pbuff)) <> 0)
{без названия игнорируем)
then
begin
GetWindowText(dWin, pbuff, sizeof(pbuff));
(получаем текст названия приложения)
st:-string(pbuff); {переводим его в строку)
if st="SlideShow1 then
begin
st:=""flBoe пернатых в одной клетке не живут." @А.Лебедь";
Application.MessageBox(Pchar(st),"",MB_OK);
(выводим предупреждение)
exit; {прерываем программу)
end;
end;
dWin:= GetWindow(dWin, GW_HWNDNEXT);
{ищем следующее приложение из списка)
end;
Application.CreateForm(TForml, Forml);
Application.Run;
end.



 
ЮЮ ©   (2006-11-28 12:02) [6]

Она же всё равно запустится. Только снимется сама же :)


 
Сергей М. ©   (2006-11-28 12:06) [7]


> Elen ©   (28.11.06 12:00) [4]


Потому что эта фича в лок.политиках безопасности не реализована. За очевидной ненадобностью.


 
Elen ©   (2006-11-28 12:08) [8]


> Mishenka

Порули вот такое :
program Project1;

uses
 Forms,
 windows,
 Unit1 in "Unit1.pas" {Form1};

var hMappedFile: THandle;

{$R *.res}

begin
 Application.Initialize;
 if OpenFileMapping(FILE_MAP_ALL_ACCESS,true,"SharedBlock")=0
 then begin
  hMappedFile:=CreateFileMapping ($FFFFFFFF, nil, PAGE_READWRITE,
0, 255, "SharedBlock");
  Application.CreateForm(TForm1, Form1);
 Application.Run;
 end else Application.MessageBox("sdfdf","adasd");
end.


Для разгону мысли ;) А в проекте можеш писать че угодно. Здесь вместо МессагеБокса можеш активить нужную форму, например хендель которой запихнеш в этот МапФайл


 
Elen ©   (2006-11-28 12:13) [9]


> Потому что эта фича в лок.политиках безопасности не реализована.
> За очевидной ненадобностью.

Причем здесь локальная политика? Автор спрашивает как написать такое. Не нужно автора вводить в заблуждение.!


 
Сергей М. ©   (2006-11-28 12:22) [10]


> Причем здесь локальная политика?



> Автор спрашивает как написать такое


"Такое" = "она не запускалась второй раз ..".

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


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


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

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


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


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


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


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


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


 
Elen ©   (2006-11-28 12:43) [13]


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

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


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


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


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


 
Anatoly Podgoretsky ©   (2006-11-28 14:48) [15]

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

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


 
Array ©   (2006-11-28 14:57) [16]


> 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


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


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

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


 
Array ©   (2006-11-29 16:09) [18]


> Mishenka   (29.11.06 16:05) [17]


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

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


 
Chuk &amp; Gek ©   (2006-11-29 21:44) [19]

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.


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

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


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


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

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


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

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

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 работает нормально. Непонятно почему сообщение не отсылается, и окно не всплывает.


 
Elen ©   (2006-12-05 12:09) [23]


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

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


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


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


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


 
Elen ©   (2006-12-05 14:05) [25]


> Mishenka

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


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

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


 
Elen ©   (2006-12-05 15:39) [27]


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

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


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


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

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


 
Elen ©   (2006-12-05 15:59) [29]


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

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


 
term1t ©   (2006-12-05 17:41) [30]

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.062 c
2-1165223382
gdaujk
2006-12-04 12:09
2006.12.24
Как программно открыть "Мой компьютер"?


15-1164825961
Kostafey
2006-11-29 21:46
2006.12.24
Какой клиент форума лучше.


15-1165289938
Slider007
2006-12-05 06:38
2006.12.24
С днем рождения ! 5 декабря


2-1165322084
Mishenka
2006-12-05 15:34
2006.12.24
Сообщение у значка программы в трее.


15-1164735877
sniknik
2006-11-28 20:44
2006.12.24
Проблема(?) с µTorrent-ом? Нет текста в настройках и др. окнах.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский