Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как определить работает ли уже данное приложение или это его перв [D7, WinXP]


rolex ©   (2005-05-02 20:23:00) 

А если работает, то сделать его активным.
Все делаю таким способом:

procedure TForm1.FormCreate(Sender: TObject);
var Wnd: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); Halt; end;
   end;
   Wnd:=GetWindow(Wnd, gw_hWndNext);
 end;
end;

Все работает прекрасно, но только вот если прога имеет Title как и название открытой папки, то она не запускается!
Помогите плиз!!!


ANB   (2005-05-04 09:49:00) [1]


> Eraser ©   (04.05.05 00:09) [12]
- но у него все равно вылезет проблема поиска своего окна. Хотя, если броадкаст + свое сообщение тоже решит проблему. Хе, я обычно все главные формы во всех проектах TfmMain делаю.


Eraser   (2005-05-04 00:09:00) [2]

ANB ©
Тебе либо имя мутекса надо делать уникальным, либо класс окна, либо сообщение. Имхо, с классом окна проще всего.


Как раз наоборот, класс окна является идентификатором, которым ты пользуешься при написании программы довольно часто, особенно если это главная форма... согласись, уникальный идентификатор типа F21619DB_D6B8_4C7E_87FA_DCA184E672AD не очень удобно использовать как название класса... а вот как название именованного мьютекса- лекго- нет ничего проще, чем объявить константу
MyUniqID = 'F21619DB_D6B8_4C7E_87FA_DCA184E672AD';
и пользуйся!


Eraser   (2005-05-04 00:03:00) [3]

В dpr файле твоего проекта перед
Application.Initialize;
впиши
 
   CreateMutex(nil, True, 'MyProject');
   if GetLastError = ERROR_ALREADY_EXISTS then
   begin
    // не обязательно MessageBox(0, PChar('Already EXISTS!'), PChar('Super proga'), MB_ICONERROR);
     Halt;
   end;


но если хочешь, чтобы автоматически активировлось старое приложение добавь регистрацию пользовательского сообщения и отвправляй его броадкастом перед вызовом halt. Само сабой это приложение должно обрабатывать это сообщение...


}{enon   (2005-05-03 20:46:00) [4]

А чем вам не нравится способ из FAQ?
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988619824&n=15


ANB   (2005-05-03 13:32:00) [5]

См.
> ANB ©   (03.05.05 10:03) [5]
или юзай MMF. Еще есть способ : регистришь 2 своих сообщения с именем похитрее и опрашиваешь всех. Если кто ответит (тут нужно хендл передать) - значит приложение запущено и хендл как раз подоспел. С мутексами оно как то . . . Маловато информации для твоих целей. А основа одна - уникальность имени. Тебе либо имя мутекса надо делать уникальным, либо класс окна, либо сообщение. Имхо, с классом окна проще всего.


rolex   (2005-05-03 13:22:00) [6]

Теперь делаю так:
procedure TForm1.FormCreate(Sender: TObject);
var Mutex:THandle;
begin
 Mutex:=CreateMutex(nil, False, 'MyMutex');
 if (Mutex=0) or (GetLastError = ERROR_ALREADY_EXISTS) then begin
 SetForegroundWindow( ???); ShowWindow( ???,SW_RESTORE); halt; end;
end;

Но только что теперь надо поставить вместо " ???", чтобы предыдущая копия программы показалась?


Marser   (2005-05-03 11:37:00) [7]


> Antonn ©   (02.05.05 20:29) [1] [Новое
>сообщение][Ответить]
> Можно ставить семафоры. CreateMutex, ReleaseMutex

Семафор это не мьютекс.


Axis_of_Evil   (2005-05-03 10:18:00) [8]

GlobalAddAtom.


ANB   (2005-05-03 10:03:00) [9]

Замени GetWindow на FindWindow и придумай класс первой формы подлиннее и поуникальнее.


begin...end   (2005-05-02 20:46:00) [10]

> rolex   (02.05.05 20:40) [3]

См. ФАК на этом сайте.


rolex   (2005-05-02 20:40:00) [11]

А можно кодом, а то я с этими работать вообще не умею.


Antonn   (2005-05-02 20:29:00) [12]

Можно ставить семафоры. CreateMutex, ReleaseMutex


Gero   (2005-05-02 20:29:00) [13]

Это плохой способ.
Используй CreateMutex.


Наверх

Титульная страница Поиск, карта сайта Написать письмо