Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.24;
Скачать: CL | DM;

Вниз

Запуск одной копии приложения   Найти похожие ветки 

 
vvip   (2004-10-07 05:16) [0]

Для ограничения запуска только одной копии приложения использую приведенный ниже код. Все работает прекрасно - за исключением малости. Окно запущенного приложения находится и активируется, но после этого перестает работать кнопка "минимизировать". Нажимается, но никакой реакции не происходит. Кто-нибудь может подсказать почему и как исправить?


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.


 
Fedia ©   (2004-10-07 06:28) [1]

Для ограничения запуска только одной копии приложения обычно использую:
 
 CreateSemaphore(nil,0,1,pchar("ListCX"));
 if GetLastError = ERROR_ALREADY_EXISTS then Halt(1);
 

где "ListCX" - константа, используемая только в одном приложении (обычно название программы).
Этот код вставляется на OnCreate главной формы.


 
vvip   (2004-10-07 06:36) [2]

Fedia
Вопрос не в том, как обнаружить, что копия одна - приведенный метод с созданием файла в памяти работает замечательно. Вопрос в том, почему после активации найденного окна в нем перестает работать кнопка "минимизировать"


 
Fedia ©   (2004-10-07 06:53) [3]

Ваш вопрос понятен. За неимением ответа, и времени на разбор примера, решил предложить другой, рабочий вариант, не приводящий к последующим неудобствам в работе :)


 
Nalexey ©   (2004-10-07 08:37) [4]

Попробуй вот так:

 if IsIconic(Handle2) then
   ShowWindow(Handle2, SW_RESTORE)

Только опять не совсем понятно, ты ищешь зачемто IDE...


 
Skyle ©   (2004-10-07 08:41) [5]

Может использовать вместо ShowWindow функцию SetForegroundWindow.
Я с ней вроде как проблем не встречал.


 
vvip   (2004-10-07 08:55) [6]

Nalexey
Спасибо за совет - попробую.
IDE я ищу затем, что часто запускаю программу из под IDE пока отлаживаю и форма окна у меня там открытая. Запущенный скомпиленный экзешник находит ту свою форму что в IDE в дизайнере, и активирует ее, вместо предыдущей копии exe-шника. Чтоб такого не случалось - определяю запущен ли IDE и если да - форму не показываю.


 
vvip   (2004-10-07 08:57) [7]

Skyle
Если сказать SetForegroundWindow для окна, которое минимизировано, оно не раскрывается. Так и остается минимизированным, хотя и Foreground


 
Jay   (2004-10-07 09:19) [8]

Можно ещё так
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) [9]

Кстати, вот еще проблема с SetForegroundWindow - если в контексте рассматриваемого примера говорить SetForegroundWindow не для найденного окна приложения, а для главного окна программы (TfrmMain) и при этом главное окно породило модальный диалог или форму (например ввод регистрации пользователя или вывесило какое-либо сообщение) - форма поднимается наверх, а модальное окно, на который переключен весь ввод клавиатуры/мыши остается позади окна. Пользователь его естественно не видит и создается впечатление, что программа повисла, поскольку не реаегирует ни на клаву, ни на мышь. Скажешь Alt-Tab туда сюда - только тогда модальное окно вылезет как и положено поверх формы его породившей. Как с этим бороться?


 
vvip   (2004-10-07 09:23) [10]

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:31) [11]

А если не SW_RESTORE, a SW_SHOW?


 
vvip   (2004-10-07 09:52) [12]

Jay
Если SW_SHOW, то минимизированное окно так и останется минимизированным


 
Jay   (2004-10-07 10:29) [13]

Если я правильно понял вопрос, то можно Главному окну делать Hide, а потом Show (ShowModal) вместо сворачивания !?


 
Jay   (2004-10-07 10:30) [14]

Если я правильно понял вопрос, то можно Главному окну делать Hide, а потом Show (ShowModal) вместо сворачивания !?



Страницы: 1 вся ветка

Текущий архив: 2004.10.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
11-1081782130
ГОСТЬище
2004-04-12 19:02
2004.10.24
Два таймера (независимо), да красивый текст.


6-1092786204
Лев Ландау
2004-08-18 03:43
2004.10.24
Как достать название страницы из WebBrowsera ?


4-1095397484
drew
2004-09-17 09:04
2004.10.24
И опять com порт


1-1097215825
V-Isa
2004-10-08 10:10
2004.10.24
Пишу скринсэйвер.


14-1096969651
karat
2004-10-05 13:47
2004.10.24
Здесь есть кто с Калининграда?