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