![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
запуск программы один раз [D6, XP]
kail © (2007-02-05 13:27:00)скажите, как сделать так что бы программу можно было запустить только один раз?
RASkov (2007-02-06 21:06:00) [1]> Кста, что подразумевалось под
> if IsIconic(Hd) then Application.Restore;
Да убрать ее(строчку) надо от туда, это я из старых свойх исходников выдернул...А вообще подразумевалось - если свернуто то восстановить
Но в данном месте не верно. Там вместо хендла окна, должен быть хендл Аппл.
> Первый вариант не совсем точен,
Согласен, Он мне даже и не нравится вообще, но пусть будет толчком для поиска(размышлений) автору
Leonid Troyanovsky (2007-02-06 11:55:00) [2]
> RASkov (05.02.07 13:34) [5]
> Вот пара вариантов:
Первый вариант не совсем точен, во многом из-за FindWindow.
Т.е., в основе д.б. EnumWindows + SendMessage и,
видимо, еще кое-что.
Кста, что подразумевалось под
if IsIconic(Hd) then Application.Restore;
не очень понятно.
--
Regards, LVT.
Правильный Вася (2007-02-06 11:12:00) [3]Neket (06.02.07 10:03) [12]
поменять местами 12 и 5 В
Neket (2007-02-06 10:03:00) [4]
> format c:/q ? )))
Так не интересно.... ((((
Алхимик (2007-02-06 10:00:00) [5]> [10] brother © (06.02.07 09:31)
>
> > Neket
>
> format c:/q ? )))
Я бы не говорил что форматирование - убийство hdd. Это скорее нокаут. :)
brother (2007-02-06 09:31:00) [6]
> Neket
format c:/q ? )))
Neket (2007-02-05 15:24:00) [7]> Один раз вообще, а после убийсво hdd ? ;)
Кстати интересно... Код в студию.... PLLLZZZZZ....
Elen (2007-02-05 13:42:00) [8]
> Один раз вообще, а после убийсво hdd ? ;)
"Научи, О великий, меня убивать hdd с одного запуска" :)
Officeman (2007-02-05 13:35:00) [9]в каком смыле 1 раз? Один раз вообще, а после убийсво hdd ? ;)
или вы говорите о запуске только одной копии программы.
я делал так:
procedure TForm1.FormCreate(Sender: TObject);
var
Wnd : hWnd;
buff : ARRAY[0.. 127] OF Char;
begin
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN
IF (Wnd <> Application.Handle) AND (GetWindow(Wnd, gw_Owner) = 0)
THEN BEGIN
GetWindowText (Wnd, buff, sizeof (buff ));
IF StrPas (buff) = Application.Title THEN
BEGIN
MessageDlg('Приложение уже загружено', mtWarning, [mbOk], 0);
Halt;
END;
END;
Wnd := GetWindow (Wnd, gw_hWndNext);
END;
END;
RASkov (2007-02-05 13:34:00) [10]> [0] kail (05.02.07 13:27)
Вопрос не правильно поставил - Надо не "запускать один раз", а чтоб один экземпляр программы работал...
Вот пара вариантов:
program Project1;
uses
Forms, windows,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
var
Hd:THandle;
begin
HD:=FindWindow('TForm1',nil);
if Hd=0 then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end else
begin
MessageBox(Hd,'Прога уже работает!','Form1',0);
if IsIconic(Hd) then Application.Restore;
end;
end.
№ 2
program OneCopy;
uses
Forms, Windows,
OneF in 'OneF.pas' {Form1};
{$R *.RES}
var
hMutex: THandle;
begin
HMutex := CreateMutex (nil, False, 'OneCopyMutex');
if WaitForSingleObject (hMutex, 0) <> wait_TimeOut then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
end.
EvChul (2007-02-05 13:34:00) [11]http://delphimaster.ru/cgi-bin/faq.pl?look=1&id=988619824&n=15
А может надо сначала искать, а потом в форум?
kail (2007-02-05 13:33:00) [12]НЕт способ есть... Поищем
Рамиль (2007-02-05 13:30:00) [13]Никак.
Но можно записать куда нибудь в реестр и при запуске проверять, если запись есть то закрыться.
Рамиль (2007-02-05 13:30:00) [14]
> скажите, как сделать так что бы программу можно было запустить
> только один раз?
Или ты в смысле одной копии?
Тогда ищи поиском.
Elen (2007-02-05 13:29:00) [15]
> kail
Здесь это обсуждалось. Воспользуйся поиском.