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

Вниз

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

 
ronyn   (2005-08-16 00:32) [0]

Для того, чтобы мое приложение не запускалось, если оно уже запущено,я использую следующий код:
type
    TForm1  =  class(TForm)
        Memo1:  TMemo;
        procedure  FormCreate(Sender:  TObject);
    private
        {  Private  declarations  }
        procedure  WMCopyData(var  msg:  TMessage);  message  WM_COPYDATA;
    public
        {  Public  declarations  }
    end;

var
    Form1:  TForm1;

implementation

{$R  *.DFM}

uses
    checkinst;

procedure  TForm1.FormCreate(Sender:  TObject);
var
    h  :  HWND;
begin
    h  :=  SetUniqueUID(Handle,  123456);  //  назначаем  уникальный  идентификатор
    if  h  <>  Handle  then
        begin
            SendString(h,  GetCommandLineStr,  Handle,  0);
            ActivatePrevInstance(h);
            Halt;
        end;
end;

procedure  TForm1.WMCopyData;
begin
      Memo1.Lines.CommaText  :=  PChar(PCopyDataStruct(msg.LParam).lpData);
end;

когда я возобновляю окно из трея, то этот код реагирует, как на открытие программы.


 
GanibalLector ©   (2005-08-16 01:14) [1]


var hSemaphore:THandle;
begin
 hSemaphore:=CreateSemaphore(nil,0,1,pChar("C31AAF3F-1CEB-487D-8E7D-267D977DB9A3"));
  try
    if GetLastError = ERROR_ALREADY_EXISTS then Exit;
    Application.Initialize;
    Application.Title:="STC-Istok :) ";
    Application.CreateForm(TForm1, Form1);
    ...
    Application.CreateForm(TForm26, Form26);
    Application.Run;

  finally
    ReleaseSemaphore(hSemaphore,1,nil);
    CloseHandle(hSemaphore);
  end;

end.



 
Leonid Troyanovsky ©   (2005-08-16 09:09) [2]


> GanibalLector ©   (16.08.05 01:14) [1]

>  hSemaphore:=CreateSemaphore(nil,0,1,pChar("C31AAF3F-1CEB-487D-


Используя memory mapped file можно передать стартующему,
например, хендл окна работающего, для его активации.
Т.е., добавив пару строк кода получаем массу
дополнительных возможностей.

--
Regards, LVT.


 
GanibalLector ©   (2005-08-17 02:09) [3]

2 Leonid Troyanovsky ©   (16.08.05 09:09) [2]
Дык...покажите.Не стесняйтесь ;)


 
Leonid Troyanovsky ©   (2005-08-17 09:17) [4]


> GanibalLector ©   (17.08.05 02:09) [3]

> Дык...покажите.Не стесняйтесь ;)


http://groups-beta.google.com/group/borland.public.delphi.database.sqlservers/msg/b7801d3979e95169

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-08-17 09:24) [5]


> ronyn   (16.08.05 00:32)  

> когда я возобновляю окно из трея, то этот код реагирует,
> как на открытие программы.


А как ты возобновляешь окно?
Его, собс-но, нужно лишь показывать-скрывать.

--
Regards, LVT.


 
Zhenya   (2005-09-20 08:16) [6]

var
Wnd:hWnd;
begin
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO
BEGIN
  IF (Wnd <> Application.Handle) AND (GetWindow(Wnd, gw_Owner) = 0)  THEN
   BEGIN
    GetWindowText (Wnd, buff, sizeof (buff ));
    IF StrPas (buff) = Application.Title THEN
       BEGIN
        MessageDlg("&#207;&#240;&#232;&#235;&#238;&#230;&#229;&#237;&#232;&#229; &#243;&#230;&#229; &#231;&#224;&#227;&#240;&#243;&#230;&#229;&#237;&#238;", mtWarning, [mbOk], 0);
        Halt;
       END;
   END;
Wnd := GetWindow (Wnd, gw_hWndNext);
END;
end;


 
user51   (2005-09-22 13:26) [7]

В файле проекта пишешь

        HPrevInst:= FindWindow("TForm1",nil);

        if HPrevInst = 0 then
        begin

 Application.Initialize;
 Application.CreateForm(TForm1, FForm1);
 Application.Run;
        end
        else
        begin
        ShowMessage("программа уже была загружена ...");
        Windows.SetFocus(HPrevInst);
        Windows.SetForegroundWindow(HPrevInst);
        end;
end;
end;


 
ANB ©   (2005-09-23 11:27) [8]


> user51   (22.09.05 13:26) [7]
- тут надо класс главной формы похитрее придумать.


 
umbra ©   (2005-09-23 11:56) [9]

можно при запуске создавать файл myprog.pid и записывать туда идентификатор процесса проги и не закрывать до окончания работы программы. При запуске проверять, существует ли этот файл и можно ли его удалить. Если существует и удалить можно, то это в прошлый раз аварийно завершилась программа. Если удалить нельзя, то значит это второй экземпляр.



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

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

Наверх




Память: 0.49 MB
Время: 0.026 c
3-1129446032
__Пупкин
2005-10-16 11:00
2005.11.27
Можно ли узнать количество таблиц у SQL сервера


4-1127462761
Still Swamp
2005-09-23 12:06
2005.11.27
Уходит фокус после keybd_event VK_RIGHT


4-1127767231
Вадя
2005-09-27 00:40
2005.11.27
Assembler, арх. проц. и т.д.


6-1124020303
Ахмет
2005-08-14 15:51
2005.11.27
TWebBrowser


2-1131624216
Rolf
2005-11-10 15:03
2005.11.27
Расширение файла.