Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
Random

Запретить запускать дубль программы, активировать при этом ранее запущенный экземпляр

18.12.2007, 00:34. Показов 3180. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу не просто запретить запуск дубля программы, но и активизировать при этом ранее запущенную прогу (её окно - скрыто, невидимо)!
На этом сайте (relib.com) есть пример:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
program Project1;
uses
  Forms,
  Windows,
  Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
 
var
  HM: THandle;
function Check: boolean;
begin
  HM := OpenMutex(MUTEX_ALL_ACCESS, false, 'MyOwnMutex');
  Result := (HM <> 0);
  if HM = 0 then HM := CreateMutex(nil, false, 'MyOwnMutex');
end;
 
begin
  if Check then Exit;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Но тут только ЗАПРЕТ!
Нашёл ещё способ:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
program Project1;
 
uses
     WinTypes,
     WinProcs,
     SysUtils, 
     Forms,
     Unit1 in 'Unit1.pas' {Form1};
 
{$R *.RES}
 
type
   PHWND = ^HWND;
 
function EnumFunc(Wnd:HWND; TargetWindow:PHWND) : bool; export;
var
  ClassName : array[0..30] of char;
begin
  Result := true;
  if GetWindowWord(Wnd,GWW_HINSTANCE) = hPrevInst then 
    begin
      GetClassName( Wnd, ClassName, 30 );
      if StrIComp( ClassName, 'TApplication' ) = 0 then
        begin 
          TargetWindow^ := Wnd;
          Result := false;
        end; 
    end;
end;
 
procedure GotoPreviousInstance;
var
  PrevInstWnd : HWND;
begin
  PrevInstWnd := 0;
  EnumWindows( @EnumFunc, Longint( @PrevInstWnd ) );
  if PrevInstWnd <> 0 then
    if IsIconic( PrevInstWnd ) then 
      ShowWindow( PrevInstWnd, SW_RESTORE )
    else
      BringWindowToTop( PrevInstWnd );
end;
 
begin 
  if hPrevInst <> 0 then
    GotoPreviousInstance
  else
    begin
      Application.CreateForm(TForm1, Form1); 
      Application.Run;
  end;
end.
Сообщает:
[Error] Project1.dpr(20): Undeclared identifier: 'GWW_HINSTANCE'
[Warning] Project1.dpr(20): Symbol 'HPrevInst' is deprecated
[Warning] Project1.dpr(45): Symbol 'HPrevInst' is deprecated

Если может быть важно: у меня Delphi6 & Windows2000
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.12.2007, 00:34
Ответы с готовыми решениями:

Как запретить запуск второй копии программы при этом сохранить аргументы?
Стало быть очень интересно, есть программа которая должна работать в единственном экземпляре. Это я сделал. Но теперь нужно как-то...

Как запретить запускать программы ( браузер ) через метро?
Как запретить запускать программы ( браузер ) через метро? если точнее то браузер Google chrome. Все нормально открывался уже месяц и вот...

Активировать ячейку Excel, не закрывая при этом форму
Добрый вечер Приходится работать с большим объемом информации, поэтому возникла необходимость экономии собственного времени. Скажите,...

4
0 / 0 / 2
Регистрация: 24.10.2007
Сообщений: 102
18.12.2007, 05:45
По-моему, проще всего активировать ранее запущенное приложение ожно с помощью зарегистрированного тобой сообщения. Определяешь сообщение, и определяешь его обработчик, который активирует ее (меняешь функцию WindowProc). При запуске программы, если видишь, что есть другая программа, просто отсылаешь ей это сообщение.
0
Random
18.12.2007, 12:59
Спасибо за совет! Я как раз в то же самое время наткнулся на этот же способ (пример), неработающий правда, ничего, переработал/исправил, вот что получилось:

в модуле проекта
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
  HM: THandle;
function Check: boolean;
begin
  HM := OpenMutex(MUTEX_ALL_ACCESS, false, 'MyOwnMutex');
  Result := (HM <> 0);
  if HM = 0 then HM := CreateMutex(nil, false, 'MyOwnMutex');
end;
 
begin
  MessageId := RegisterWindowMessage(PChar('Some Unical Key'));
  if Check then
    PostMessage(HWND_BROADCAST,MessageId,0,0)
  else begin
    Application.Initialize;
    Application.CreateForm(TMainForm, MainForm);
  Application.Run;
  end;
коде главной формы добавил обработчик события Application.OnMessage :
Delphi
1
2
3
4
5
6
7
8
procedure TMainForm.OnAppMessage(var M: TMsg; var Ret: Boolean);
begin
  if M.Message = MessageId then begin
    Ret := True;
    Show;
    SetForegroundWindow(MainForm.Handle);
  end;
end;
всё работает!!!
Random
18.12.2007, 13:16
добавление для таких же чайников как я:

в uses модуля проекта не забудьте добавить Windows
и определить переменную MessageId:cardinal в модуле формы рядом с определением переменной самой формы, например это будет выглядеть так:
Delphi
1
2
3
var
  MainForm: TMainForm;
  MessageId: Cardinal;
0 / 0 / 0
Регистрация: 19.10.2007
Сообщений: 14
22.12.2007, 15:01
Наверное такой пример (или похожий) уже был, но:

у Формы Form1.caption новой (при создании) напиши :=new;
а потом проверка есть ли в памяти форма со строой old, если нет то продолжать загрузку (работу) и Form1.caption:=old; если есть то (а как активировать не знаю) выход.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.12.2007, 15:01
Помогаю со студенческими работами здесь

На страничке при клике на линк динамически открывается ранее скрытое поле, при этом страничка подднимается вверх
На страничке при клике на линк динамически открывается ранее скрытое поле, при этом страничка подднимается вверх (к началу, а скрытое поле...

Запретить дубль страницы на поддомене
Здравствуйте. На главной странице site.ru, на странице пагинации site.ru/page/1/ и на странице статей, обнаружил дубли страниц -...

Как отрубать текущий процесс если уже есть запущенный экземпляр?
дело происходит на C# при этом хочется, чтобы новая копия процесса перед закрытием себя показывала спрятанное окно старой копии ...

Возможно ли через фаервол полностью запретить программе доступ в сеть не запретив его при этом браузеру?
В любом из виденных мной фаерволов есть возможность запретить программе доступ в сеть. Тем не менее есть куча системных программ типа...

При выходе из программы запоминать выбранный ранее индекс элемента ListBox
Есть прога, словарь. В листбоксе все слова словаря, когда выбираешь одно слово, то он выдает в следующей форме его перевод и примеры. Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru