Главная страница
    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.47 MB
Время: 0.008 c
2-1262182249
11223344
2009-12-30 17:10
2010.03.07
классы


1-1239276932
HandBrake
2009-04-09 15:35
2010.03.07
Enter вместо Tab / Delphi 2007


9-1183152132
ElectriC
2007-06-30 01:22
2010.03.07
Мобильные игры


3-1235022074
Программер
2009-02-19 08:41
2010.03.07
5 миллионов записей


15-1261471578
StriderMan
2009-12-22 11:46
2010.03.07
if Value = True then





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский