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

Вниз

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

 
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 вся ветка

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

Наверх





Память: 0.47 MB
Время: 0.014 c
1-1130912859
Fay
2005-11-02 09:27
2005.11.27
Обязательно ли вызывать FreeLibrary?


1-1130910009
Ardeh
2005-11-02 08:40
2005.11.27
таблицы в WORD е!


4-1127473166
Still Swamp
2005-09-23 14:59
2005.11.27
keybd_event и GetKeyStatus отказываются работать в терминальном


1-1130935984
BobbyDigital
2005-11-02 15:53
2005.11.27
Полосы прокрутки в Combobox


1-1131018624
ancot
2005-11-03 14:50
2005.11.27
Прозрачный TWinControl





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