Форум: "WinAPI";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизКак определить работает ли уже данное приложение или это его перв Найти похожие ветки
← →
rolex (2005-05-02 20:23) [0]А если работает, то сделать его активным.
Все делаю таким способом:
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 как и название открытой папки, то она не запускается!
Помогите плиз!!!
← →
Antonn © (2005-05-02 20:29) [1]Можно ставить семафоры. CreateMutex, ReleaseMutex
← →
Gero © (2005-05-02 20:29) [2]Это плохой способ.
Используй CreateMutex.
← →
rolex (2005-05-02 20:40) [3]А можно кодом, а то я с этими работать вообще не умею.
← →
begin...end © (2005-05-02 20:46) [4]> rolex (02.05.05 20:40) [3]
См. ФАК на этом сайте.
← →
ANB © (2005-05-03 10:03) [5]Замени GetWindow на FindWindow и придумай класс первой формы подлиннее и поуникальнее.
← →
Axis_of_Evil © (2005-05-03 10:18) [6]GlobalAddAtom.
← →
Marser © (2005-05-03 11:37) [7]
> Antonn © (02.05.05 20:29) [1] [Новое
>сообщение][Ответить]
> Можно ставить семафоры. CreateMutex, ReleaseMutex
Семафор это не мьютекс.
← →
rolex (2005-05-03 13:22) [8]Теперь делаю так:
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;
Но только что теперь надо поставить вместо "???", чтобы предыдущая копия программы показалась?
← →
ANB © (2005-05-03 13:32) [9]См.
> ANB © (03.05.05 10:03) [5]
или юзай MMF. Еще есть способ : регистришь 2 своих сообщения с именем похитрее и опрашиваешь всех. Если кто ответит (тут нужно хендл передать) - значит приложение запущено и хендл как раз подоспел. С мутексами оно как то . . . Маловато информации для твоих целей. А основа одна - уникальность имени. Тебе либо имя мутекса надо делать уникальным, либо класс окна, либо сообщение. Имхо, с классом окна проще всего.
← →
}{enon © (2005-05-03 20:46) [10]А чем вам не нравится способ из FAQ?
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988619824&n=15
← →
Eraser © (2005-05-04 00:03) [11]В 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. Само сабой это приложение должно обрабатывать это сообщение...
← →
Eraser © (2005-05-04 00:09) [12]ANB ©
Тебе либо имя мутекса надо делать уникальным, либо класс окна, либо сообщение. Имхо, с классом окна проще всего.
Как раз наоборот, класс окна является идентификатором, которым ты пользуешься при написании программы довольно часто, особенно если это главная форма... согласись, уникальный идентификатор типа F21619DB_D6B8_4C7E_87FA_DCA184E672AD не очень удобно использовать как название класса... а вот как название именованного мьютекса- лекго- нет ничего проще, чем объявить константу
MyUniqID = "F21619DB_D6B8_4C7E_87FA_DCA184E672AD";
и пользуйся!
← →
ANB © (2005-05-04 09:49) [13]
> Eraser © (04.05.05 00:09) [12]
- но у него все равно вылезет проблема поиска своего окна. Хотя, если броадкаст + свое сообщение тоже решит проблему. Хе, я обычно все главные формы во всех проектах TfmMain делаю.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c