Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2012, 01:09   #1
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию запуск копии программы [Delphi7]

Всем доброго времени суток. Столкнулся с таким вопросом, как запретить запуск 2 копий программы, и в том случаи если программа свернута, её развернуть и сделать её окно активным.

Код:
var
  hw : HWND;
begin
  Application.Initialize;
  Application.Title := 'My App';
  hw := CreateMutex(nil,False,'1myapp1');
  if GetLastError <> Error_ALREADY_EXISTS then
  begin
    Application.CreateForm(TForm1,Form1);
    Application.Run;
  end
  else
  begin
    Application.Terminate;
    ReleaseMutex(hw);
  end;
end.
Запрет запуска второй копии есть, но вот в чем проблема. Уже не 1 способом пробовал развернуть 1 копию программы и сделать её активной.

Последний раз редактировалось -Jack-; 06.10.2012 в 01:19.
-Jack- вне форума Ответить с цитированием
Старый 06.10.2012, 01:26   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Попробуй мой вариант
Человек_Борща вне форума Ответить с цитированием
Старый 06.10.2012, 01:53   #3
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

По поводу OpenMutex - это я дополнил, спасибо, но вот загвоздка по поводу развернуть окно - осталась
-Jack- вне форума Ответить с цитированием
Старый 06.10.2012, 01:57   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Пусть мютектс пытается создасться, и вернет результат. Если успешно, то и вы продолжнаете запуск программы, иначе EPIC FAIL.
Человек_Борща вне форума Ответить с цитированием
Старый 06.10.2012, 02:01   #5
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

С этим я разобрался, спасибо ... Вопрос остается в том, как развернуть первую копию приложения
Цитата:
end
else
begin
// сюда бы волшебные команды, которые будут разворачивать уже запущенную копию программы
Application.Terminate;
ReleaseMutex(hw);
end;
end.
-Jack- вне форума Ответить с цитированием
Старый 06.10.2012, 02:45   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Никак. Они друг о друге не знают. Вариант без мютексов я вам по ссылке давал.
Человек_Борща вне форума Ответить с цитированием
Старый 06.10.2012, 02:53   #7
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Да здравствуйте, как же никак ...?!
Цитата:
MainWnd:= FindWindow(nil, 'Пример');
showwindow(MainWnd, SW_HIDE);
showwindow(MainWnd, SW_SHOWMAXIMIZED);
Загвоздка в чем: когда использую код ( постом выше ) из своего приложения, то он не работает почему то ... А если из другого, то на ура ...

Возможно искать окно не только по названию, но и по другим каким либо параметрам ?

Последний раз редактировалось Stilet; 06.10.2012 в 12:52.
-Jack- вне форума Ответить с цитированием
Старый 06.10.2012, 08:12   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

-Jack-, по классу окна. Первый параетр FindWindow.
Интересно, почему вы так к мютексам привязались?
Человек_Борща вне форума Ответить с цитированием
Старый 06.10.2012, 10:04   #9
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Теоретически есть более простой и широко известный вариант проверки на запуск 2-го экземпляра приложения.
Код в dpr:
Код:
const
  MemFileSize = 127;
  MemFileName = 'one_example';

var
  MemHnd: HWND;

begin
  MemHnd := CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0,
                              MemFileSize, MemFileName);
  if GetLastError <> ERROR_ALREADY_EXISTS then begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end else begin
    ShowWindow(FindWindow(nil, 'Form1'), SW_RESTORE);
    SetForegroundWindow(FindWindow(nil, 'Form1'));
  end;
  CloseHandle(MemHnd);
end.
Но советовать его для применения язык не поворачивается - после активации окна первого экземпляра приложения кнопка минимизации почему-то не работает, не отвечает на нажатие (в Д7, во всяком случае так).
Этот вариант, где есть и попутная активизация первого экземпляра, основан на поиске нужного окна в системе и его активации. Т.е. мы пытаемся активизировать окно уже "чужого" приложения.

По-другому сделано в варианте, который предлагает Человек_Борща на своем сайте (ссылка в этой теме есть). Там активацию экземпляра приложения делает сам экземпляр приложения (первый который).
А это уже совсем другой результат - при запуске второго экземпляра первый выскакивает поверх всех окон, все его кнопки работосопособны, а второй не запускается.
И пусть этот вариант несколько тяжеловеснее, но работает он так как нам надо, а не винде. Проверено на Д7.
Прик вне форума Ответить с цитированием
Старый 06.10.2012, 10:48   #10
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию OneInstancesEx

или вот компонент OneInstancesEx
Вложения
Тип файла: rar OneInstancesEx.rar (6.8 Кб, 71 просмотров)
beegl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск копии webbrowser с подстановкой адреса s2004 Win Api 3 14.10.2012 19:12
как разрешить запуск второй копии чужого приложения s1s1s1 Общие вопросы Delphi 4 02.11.2011 01:47
Запуск только одной копии приложения Casper-SC Общие вопросы .NET 1 18.07.2010 02:06
Обновление копии программы в оперативной памяти. Garacio_cain Общие вопросы Delphi 5 17.05.2009 10:29