Форум: "Основная";
Текущий архив: 2002.10.21;
Скачать: [xml.tar.bz2];
ВнизМастера подскажите! Нужно запретить повторный запуск программы? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c