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

Вниз

Копия программы   Найти похожие ветки 

 
RyDmi ©   (2004-08-19 03:36) [0]

Как сделать так, чтобы при повторном запуске моей програмы( в то время, когда она уже запущена ) запускалась не вторая копия, а становилось активным окно первой запущеной программы?


 
Кириешки ©   (2004-08-19 05:08) [1]

Например вот так:


Form1.onactivate();
begin
 SetWindowText(application.handle,"Кириешки");
end

Form1.oncreate();
begin
if FindWindow(nil,"Кириешки")<>0 then
  begin
   showmessage("Программа уже запущена");
   ShowWindow(findwindow(nil,"Кириешки"),SW_SHOW);
   halt;
  end;
end;



Реально работает :)))


 
Кириешки ©   (2004-08-19 05:37) [2]

ЗЫ.
Ну, а дальше - дело техники. Надо тебе на передний план окно вывести, можно так

procedure SwitchToThisWindow(h1: hWnd; x: bool); stdcall;
  external user32 Name "SwitchToThisWindow";
         {x = false: Size unchanged, x = true: normal size}

procedure TForm1.Button2Click(Sender: TObject);
begin
  SwitchToThisWindow(FindWindow("Кириешкиd", nil), True);
end;


А если такой вариант не устраевает - ищи в FAQ, стопудово есть.


 
Алхимик ©   (2004-08-19 09:33) [3]


> [1] Кириешки ©   (19.08.04 05:08)


1.Не подходит для приложения, не имеющего окна.
2.Поскольку от момента запуска программы до момента создания окна проходит определенное время, которое при сильно загруженной системе может измеряться секундами, возможен запуск нескольких копий, особенно у пользователей, нервно манипулирующих мышкой. :)


 
Игорь Шевченко ©   (2004-08-19 10:16) [4]


> Как сделать так, чтобы при повторном запуске моей програмы(
> в то время, когда она уже запущена ) запускалась не вторая
> копия, а становилось активным окно первой запущеной программы?


Например, FAQ почитать


 
Anatoly Podgoretsky ©   (2004-08-19 13:23) [5]

А ни как, вторая копия все равно запустится, если только конечно не будешь переделывать Виндоус.


 
Кириешки ©   (2004-08-19 16:15) [6]

Алхимик ©   (19.08.04 09:33) [3]

1)В вопросе не было указано что программа не имеет окна.
2)Не может, надо только поменять обработчики на более ранние и все. В любом случае какая-то копия запустится первой, а значит все остальные будут видить что ОКНО УЖЕ СУЩЕСТВУЕТ! Я же пробовал, и все нормально работало. Хоть изтыкайся мышкой. (правда не стеми обработчиками которые я написал, а с более ранними.)


 
Алхимик ©   (2004-08-19 22:53) [7]

>[6] Кириешки ©   (19.08.04 16:15)

> 1)В вопросе не было указано что программа не имеет окна.


Программа, в общем случае, не обязана иметь окно.


 
akvilon ©   (2004-08-19 23:03) [8]

CreateMutex
или создать секцию в экзешнике типа read write shared  (общую, разделяемую всеми версиями программы). А в ней создать перменную типа boolean с начала false, первый экзепляр проверяет, если false то делаем true. Остальные экземпляры видя true делают, что надо.


 
RyDmi ©   (2004-08-20 01:06) [9]

To akvilon: Делал так:

program Alpha;

uses
 Forms,Windows,
 Unit1 in "Unit1.pas" {Form1},
 Unit2 in "Unit2.pas" {Form2};

{$R *.res}
var
 Mutex : THandle;
begin
 Mutex := CreateMutex(nil, False, "Alpha");
 if Mutex = 0 then
   MessageBox(0,"Невозможно создать Мутекс!", "Ошибка!",
     MB_OK)
else if GetLastError <> ERROR_ALREADY_EXISTS then
begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.CreateForm(TForm2, Form2);
 Application.Run;
end;
end.


Вторая копия не запускалась, Но как мне сделать так, чтобы окно становилось активным или, например, как в Winamp"e передавались параметры командной строки( когда добавляешь песню при запущеном плеере через PopupMenu командера, песня добавляется в список уже запущенного проигрывателя, а вторая копия уже не запускается). Как мне это осуществить?


 
DeadMeat ©   (2004-08-20 01:15) [10]

Если менять чисто твой код, то:

program Alpha;

uses
Forms,Windows,
Unit1 in "Unit1.pas" {Form1},
Unit2 in "Unit2.pas" {Form2};

{$R *.res}
var
Mutex : THandle;
begin
Mutex := CreateMutex(nil, False, "Alpha");
if Mutex = 0 then MessageBox(0,"Невозможно создать Мутекс!", "Ошибка!", MB_OK)
else
begin
 if GetLastError <> ERROR_ALREADY_EXISTS then
 begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
 end
 else
 begin
  ПослатьСообщениеОкнуИлиДругимСпособом;
 end;
end;
end.

Нечто вроде этого...

---
...Death Is Only The Begining...


 
Алхимик ©   (2004-08-20 01:32) [11]


> окно становилось активным

SetForegroundWindow переводит окно в приоритетный режим


> передавались параметры командной строки

ParamCount
ParamStr


> Mutex := CreateMutex(nil, False, "Alpha");

Не называй мутекс Альфой. Во всех примерах его так называют. :)
Есть смысл что нить поуникальнее.


 
RyDmi ©   (2004-08-20 22:21) [12]

Спасибо всем, попробую разобраться.



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

Форум: "WinAPI";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.033 c
14-1094447269
hawkins
2004-09-06 09:07
2004.10.03
как поставить защиту на свою прог-му?


4-1093810138
ВАП
2004-08-30 00:08
2004.10.03
запуск


6-1090844845
Layner
2004-07-26 16:27
2004.10.03
Как послать вместе с посылкой POST строку Referrer?


3-1094644138
DA
2004-09-08 15:48
2004.10.03
Запрос с параметром в MSSQL


3-1094469957
Yrtimd
2004-09-06 15:25
2004.10.03
синхронизация таблиц





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский