![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как определить работает ли уже данное приложение или это его перв [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.