![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
узнать запущена моя программа или нет [D7]
evgenij © (2008-09-04 15:11:00)Доброго времени суток!
Помогите плиз...
Хочу узнать запущена моя программа или нет на даном компе.
искал,смотрел, читал...результат вот:
var
Wnd,ggg : 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
SetForegroundWindow(wnd);
ShowWindow(wnd,SW_SHOWNORMAL);
Halt;
end;
end;
Wnd := GetWindow (Wnd, gw_hWndNext);
end;
но на Haltвыдает сообщение об ошибке EAccessViolation
-что не так...ага код расположен в OnCreate формы.
спс
(2009-04-04 18:16:00) [1]Удалено модератором
(2009-04-04 18:15:00) [2]Удалено модератором
Deltas (2008-09-08 00:15:00) [3]
> DVM © (05.09.08 22:53) [9]
> и это работает?
А что Вас смущает?
Германн (2008-09-06 01:13:00) [4]
> Amoeba © (05.09.08 20:54) [8]
Добавил в свой список.
DVM (2008-09-05 22:53:00) [5]
> Deltas © (05.09.08 18:58) [7]
> hWnd := FindWindow(PChar('TMainForm'), PChar(Application.
> Title));
и это работает?
Amoeba (2008-09-05 20:54:00) [6]Есть статья:
http://www.delphimaster.ru/articles/limit.html
Deltas (2008-09-05 18:58:00) [7]
> Если задаться целью, то обмануть можно любую программу
Так и я о том же. Я использую следующий код для предотвращения запуска двух версий одного приложения:
procedure TMainForm.FormCreate(Sender: TObject);
var hWnd: THandle;
begin
Caption := '';
hWnd := FindWindow(PChar('TMainForm'), PChar(Application.Title));
if hWnd <> 0 then begin
Application.ShowMainForm := False;
Application.Terminate;
if IsWindowVisible(hWnd) then SetForegroundWindow(hWnd);
Exit;
end;
Caption := Application.Title;
end;
А если речь идет о страховке от случайностей, то класс формы можно и посложнее придумать, чем TMainForm. И выполнять поиск окна функцией FindWindow только по классу, следовательно изменение заголовка окна сторонним приложением никак не навредит.
evvcom (2008-09-05 08:18:00) [8]
> В таком случае, некоторое приложение может поступить следующим
> образом
Если задаться целью, то обмануть можно любую программу, а от случайности можно застраховаться, придумав вместо NQ_EXISTS более уникальный идентификатор, например, какой-нибудь GUID
Deltas (2008-09-04 20:43:00) [9]
> текст окна могут и поменять, это не надежно
В таком случае, некоторое приложение может поступить следующим образом:
var CheckEvent: TEvent;
begin
CheckEvent := TEvent.CreateEvent(nil, false, false, 'NQ_EXISTS');
CheckEvent.SetEvent;
CheckEvent.Free;
end;
Сергей М. (2008-09-04 17:41:00) [10]
> ага код расположен в OnCreate формы
Ты вот задумайся - нафига создавать форму ДО того как ты определил, что приложение уже было запущено ?
Сначала делается проверка, а уж только при положительном результате проверки создается форма и/или разворачивается какая-то основная функциональность программы ..
Проверка эта делается прямо в тексте файла проекта (dpr) ДО строчки Application.Initialize.
И выход в этом случае делается не по halt (это аварийный выход, а никакой ведь аварии нет), а, скажем, по Exit (нормальное завершение)
Palladin (2008-09-04 15:25:00) [11]http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988619824&n=15
evgenij (2008-09-04 15:25:00) [12]
> текст окна могут и поменять, это не надежно
ну а на хальт почему матюкается
Vlad Oshin (2008-09-04 15:18:00) [13]текст окна могут и поменять, это не надежно
var
CheckEvent: TEvent;
begin
CheckEvent:= TEvent.Create(nil, false, true, 'NQ_EXISTS');
if CheckEvent.WaitFor(10) <> wrSignaled then
begin
Application.Terminate;
Halt;
end;
end;