Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1261400337
@!!ex
2009-12-21 15:58
2010.03.07
Как заставить приложение работать с Кирелическим набором символов


2-1262677121
Андрей Пл
2010-01-05 10:38
2010.03.07
Остановить выполнение пророги в задонном месте до опред. события?


6-1213405371
antoxa2005
2008-06-14 05:02
2010.03.07
Подскажите, а как добавить вложение к письму стандарного mail аге


2-1262601063
dragon3232
2010-01-04 13:31
2010.03.07
помогите с заданием


15-1261258220
Юрий
2009-12-20 00:30
2010.03.07
С днем рождения ! 20 декабря 2009 воскресенье





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский