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

Вниз

узнать запущена моя программа или нет   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
2-1262761116
Igor2100
2010-01-06 09:58
2010.03.07
Потоки+dll


2-1262706738
Zalm
2010-01-05 18:52
2010.03.07
Работа с IStorage


10-1163588110
312kbps
2006-11-15 13:55
2010.03.07
Получить конект через IDispatch !


3-1235913922
sco
2009-03-01 16:25
2010.03.07
ошибка в SQL коде


2-1262071082
Who_is_you?
2009-12-29 10:18
2010.03.07
Чтение и запись в LPT в режиме Bidirection Win XP, Win98?