![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск одной копии приложения [D5, D7, WinXP]
vvip © (2004-10-07 05:16:00)Для ограничения запуска только одной копии приложения использую приведенный ниже код. Все работает прекрасно - за исключением малости. Окно запущенного приложения находится и активируется, но после этого перестает работать кнопка "минимизировать". Нажимается, но никакой реакции не происходит. Кто-нибудь может подсказать почему и как исправить?
const
MemFileSize = 1024;
MemFileName = 'one_inst_sup_memfile';
var
MemHnd : HWND;
Handle1: Longint;
Handle2: Longint;
begin
{ Попытаемся создать файл в памяти }
MemHnd := CreateFileMapping(HWND($FFFFFFFF),
nil,
PAGE_READWRITE,
0,
MemFileSize,
MemFileName);
{ Если файл не существовал запускаем приложение }
if GetLastError<>ERROR_ALREADY_EXISTS then begin
Application.Initialize;
Application.Title := 'Проект';
Application.CreateForm(TDM, DM);
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end else begin
Handle1 := FindWindow('TApplication','Проект');
if Handle1<>0 then begin
Handle2 := FindWindow('TAppBuilder',nil);
if Handle2=0 then begin
Handle2 := FindWindow('TfrmMain','Проект');
ShowWindow(Handle2, SW_RESTORE);
end;
SetForegroundWindow(Handle1); end;
end;
CloseHandle(MemHnd);
end.
Jay (2004-10-07 10:30:00) [1]Если я правильно понял вопрос, то можно Главному окну делать Hide, а потом Show (ShowModal) вместо сворачивания !?
Jay (2004-10-07 10:29:00) [2]Если я правильно понял вопрос, то можно Главному окну делать Hide, а потом Show (ShowModal) вместо сворачивания !?
vvip (2004-10-07 09:52:00) [3]Jay
Если SW_SHOW, то минимизированное окно так и останется минимизированным
Jay (2004-10-07 09:31:00) [4]А если не SW_RESTORE, a SW_SHOW?
vvip (2004-10-07 09:23:00) [5]Jay,
Ok, переформулируем вопрос по-другому:
Кто-нибудь может подсказать почему после выполнения нижеприведенного кусочка кода Окно приложения перестает реагировать на кнопку "Минимизировать"? Кнопка нажимается, но никакого эффекта сворачивания не происходит.
Handle1 := FindWindow('TApplication','Проект');
if Handle1<>0 then begin
Handle2 := FindWindow('TAppBuilder',nil);
if Handle2=0 then begin
Handle2 := FindWindow('TfrmMain','Проект');
ShowWindow(Handle2, SW_RESTORE);
end;
SetForegroundWindow(Handle1);
end;
Jay (2004-10-07 09:19:00) [6]Можно ещё так
Uses
SyncObjs;
var
check_event: TEvent;
check_event := TEvent.Create(nil, false, true, 'MYPROGRAM_CHECKEXIST');
if check_event.WaitFor(10) = wrSignaled then
begin
//если одна, то...
end
vvip (2004-10-07 09:19:00) [7]Кстати, вот еще проблема с SetForegroundWindow - если в контексте рассматриваемого примера говорить SetForegroundWindow не для найденного окна приложения, а для главного окна программы (TfrmMain) и при этом главное окно породило модальный диалог или форму (например ввод регистрации пользователя или вывесило какое-либо сообщение) - форма поднимается наверх, а модальное окно, на который переключен весь ввод клавиатуры/мыши остается позади окна. Пользователь его естественно не видит и создается впечатление, что программа повисла, поскольку не реаегирует ни на клаву, ни на мышь. Скажешь Alt-Tab туда сюда - только тогда модальное окно вылезет как и положено поверх формы его породившей. Как с этим бороться?
vvip (2004-10-07 08:57:00) [8]Skyle
Если сказать SetForegroundWindow для окна, которое минимизировано, оно не раскрывается. Так и остается минимизированным, хотя и Foreground
vvip (2004-10-07 08:55:00) [9]Nalexey
Спасибо за совет - попробую.
IDE я ищу затем, что часто запускаю программу из под IDE пока отлаживаю и форма окна у меня там открытая. Запущенный скомпиленный экзешник находит ту свою форму что в IDE в дизайнере, и активирует ее, вместо предыдущей копии exe-шника. Чтоб такого не случалось - определяю запущен ли IDE и если да - форму не показываю.
Skyle (2004-10-07 08:41:00) [10]Может использовать вместо ShowWindow функцию SetForegroundWindow.
Я с ней вроде как проблем не встречал.
Nalexey (2004-10-07 08:37:00) [11]Попробуй вот так:
if IsIconic(Handle2) then
ShowWindow(Handle2, SW_RESTORE)
Только опять не совсем понятно, ты ищешь зачемто IDE...
Fedia (2004-10-07 06:53:00) [12]Ваш вопрос понятен. За неимением ответа, и времени на разбор примера, решил предложить другой, рабочий вариант, не приводящий к последующим неудобствам в работе :)
vvip (2004-10-07 06:36:00) [13]Fedia
Вопрос не в том, как обнаружить, что копия одна - приведенный метод с созданием файла в памяти работает замечательно. Вопрос в том, почему после активации найденного окна в нем перестает работать кнопка "минимизировать"
Fedia (2004-10-07 06:28:00) [14]Для ограничения запуска только одной копии приложения обычно использую:
CreateSemaphore(nil,0,1,pchar('ListCX'));
if GetLastError = ERROR_ALREADY_EXISTS then Halt(1);
где 'ListCX' - константа, используемая только в одном приложении (обычно название программы).
Этот код вставляется на OnCreate главной формы.