Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.03 c
14-1097128849
Fanat
2004-10-07 10:00
2004.10.24
Онлайн игрушки


3-1096309007
Denisov
2004-09-27 22:16
2004.10.24
Работа с BLOB.


4-1095710571
Саша
2004-09-21 00:02
2004.10.24
Завершение работы Windows


3-1096042068
TTTT
2004-09-24 20:07
2004.10.24
RecordCount


6-1092720965
serg128
2004-08-17 09:36
2004.10.24
Как принимать/отправлять сообщения при помощи TNMUDP?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский