Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.21;
Скачать: CL | DM;

Вниз

Мастера подскажите! Нужно запретить повторный запуск программы?   Найти похожие ветки 

 
wer1   (2002-10-10 03:55) [0]

Мастера подскажите! Нужно запретить повторный запуск программы?
В Faq был приведен код указанный ниже однако по каким то причинам
у меня он не отрабатывает, может быть есть какие либо моменты
которые в данном коде не учтены.
procedure TForm1.FormCreate(Sender: TObject);
begin
{Проверяем есть ли указатель на предыдущую копию приложения} IF hPrevInst <> 0 THEN BEGIN
{Если есть, то выдаем сообщение и выходим}
MessageDlg("Программа уже запущена!", mtError, [mbOk], 0); Halt;
END;
{Иначе - ничего не делаем (не мешаем созданию формы)}
end;


 
Николай Быков ©   (2002-10-10 04:01) [1]

http://delphi.mastak.ru/cgi-bin/faq.pl?look=1&id=988619824&n=15

Там подоробно все расписано

Там все учтено. Я сам делал так. Ты поробуй написать это без каких-либо изменений, а потом уж добавляй свое


 
wer1   (2002-10-10 04:13) [2]

Обязательно попробую следующие процедуры однако я хочу разобраться с первой из них, т.е которую я привел выше из того же FAQ.
Коль ее привели в качестве примера значит она должна работать,
а у меня она не реагируе на повторный запуск приложения, когда ставлю IF hPrevInst = 0 THEN BEGIN отрабатывает сообщение но насколько я правильно понял если =0 то это первый запуск, а
<>0 приложение уже запущено, однако именно это условие и не отрабатывает.


 
Rouse_ ©   (2002-10-10 04:25) [3]

Вот как это реализовано в советах Озерова

В блоке begin..end модуля .dpr:



--------------------------------------------------------------------------------
begin

if HPrevInst <>0 then begin
ActivatePreviousInstance;
Halt;
end;
end;


Реализация в модуле:



--------------------------------------------------------------------------------
unit PrevInst;

interface

uses

WinProcs,
WinTypes,
SysUtils;

type
PHWnd = ^HWnd;

function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool; export;

procedure ActivatePreviousInstance;

implementation

function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool;
var

ClassName : array[0..30] of char;
begin

Result := true;
if GetWindowWord(Wnd, GWW_HINSTANCE) = HPrevInst then begin
GetClassName(Wnd, ClassName, 30);
if STRIComp(ClassName,"TApplication")=0 then begin
TargetWindow^ := Wnd;
Result := false;
end;
end;
end;

procedure ActivatePreviousInstance;
var

PrevInstWnd: HWnd;
begin

PrevInstWnd := 0;
EnumWindows(@EnumApps,LongInt(@PrevInstWnd));
if PrevInstWnd <> 0 then
if IsIconic(PrevInstWnd) then
ShowWindow(PrevInstWnd,SW_Restore)
else
BringWindowToTop(PrevInstWnd);
end;

end.


Лично я обычно использую мутексы

Желаю успехов


 
PVOzerski ©   (2002-10-10 04:43) [4]

hPrevinst - это наследие Win16, оставшееся для совместимости,
но фактически не функционирующее в Win32, где каждый процесс
имеет свое адресное пространство. Так что оставьте использование
hPrevinst для D1 и BPW, а в D5 используйте либо мутексы (что все рекомендуют),
либо FindWindow для окна-маркера с уникальным именем заголовка или
(что лучше) класса.


 
wer1   (2002-10-10 04:52) [5]

Я понял.Спасибо.



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

Текущий архив: 2002.10.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
14-68932
AL2002
2002-09-27 10:19
2002.10.21
Хотите приколоться?


14-68949
FLIZ
2002-09-27 17:04
2002.10.21
я просто фигел, вот полюбуйтесь


14-68943
Гогия
2002-09-27 15:16
2002.10.21
Перспективы развития в современных условиях


1-68721
Shapovalov K
2002-10-11 09:59
2002.10.21
Как сделать активным орпеделённый итем ComboBox а?


14-68945
AndSoft
2002-09-27 14:51
2002.10.21
MySqlDac глючит