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) 

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


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


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



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


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

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


Elen   (2006-11-28 12:13:00) [22]


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

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


Elen   (2006-11-28 12:08:00) [23]


> 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.


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


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


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


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


ЮЮ   (2006-11-28 12:02:00) [25]

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


alex810   (2006-11-28 12:01:00) [26]

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

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.


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


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

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


ЮЮ   (2006-11-28 11:59:00) [28]

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


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


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


Никак.


alex810   (2006-11-28 11:53:00) [30]

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


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.




Страницы:   1 2

Наверх

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