Конференция "Начинающим" » Найти второй экземпляр программы не через имя окна
 
  • kashey © (07.08.18 23:03) [0]
    Дело в том, что в названии можем быть имя открытого файла. Можно при запуске второго экземпляра найти первый (но не по имени) ?
  • Styx © (08.08.18 00:07) [1]
    Можно искать по имени класса окна... https://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx
  • Плохиш © (08.08.18 11:40) [2]
    Mutex - жеж
  • Styx © (08.08.18 12:26) [3]
    Mutex ответит на вопрос, запущен второй экземпляр или нет. А найти окно и активировать его или послать в него команду всё равно придётся.
  • DayGaykin © (08.08.18 15:03) [4]
    На помощь может придти разделяемая память
  • kashey © (08.08.18 15:38) [5]
    Подскажите где я торможу. Или не правильно отсылаю сообщение или не правильно ловлю.


    program Project1;

    uses
     Forms,
     Windows,
     Dialogs,
     Messages,
     Unit1 in 'Unit1.pas' {Form1};

    {$R *.res}

    var
     H: THandle;
     HW: HWND;

    begin
     H := CreateMutex(nil, True, 'UniqueName');
     if GetLastError = ERROR_ALREADY_EXISTS then begin

       HW := FindWindow('TForm1',nil);
       if HW <> 0 then begin
         ShowMessage('OK1');
         SendMessage(HW, WM_SYSCOMMAND, SC_RESTORE, 0);
         Exit;
       end else begin

       end;
     end;
     Application.Initialize;
     Application.CreateForm(TForm1, Form1);
     Application.Run;
    end.


    ------------------------------------------------
    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs;

    type
     TForm1 = class(TForm)
       procedure FormCreate(Sender: TObject);
     private
       { Private declarations }
     public
       { Public declarations }
       procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     Application.OnMessage := AppMessage;
    end;

    procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
    begin
     if (Msg.message = WM_SYSCOMMAND) and (Msg.WParam = SC_RESTORE) then begin
       ShowMessage('OK2');
     end;
     
     inherited;
    end;

    end.

  • Игорь Шевченко © (08.08.18 17:49) [6]

    > Подскажите где я торможу



    >      SendMessage(HW, WM_SYSCOMMAND, SC_RESTORE, 0);


    Тут

    В Application.OnMessage попадают только сообщения, посланные по PostMessage.
    Кроме того, раз ты обрабатываешь сообщение в отдельном обработчике, посылай не стандартное, а свое, типа WM_USER + сколько_то
  • Плохиш © (11.08.18 20:43) [7]

    > Styx ©   (08.08.18 12:26) [3]
    >
    > Mutex ответит на вопрос, запущен второй экземпляр или нет.
    >

    Да, правда.
    Автору поможет FileMapping:

    var
       FHandle:  THandle;
       FBuffer:  Pointer;
       FAppHnd:  HWND;

    begin
     FHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
                                  4, 'uniquenameformyprogram');
     FBuffer := MapViewOfFile(FHandle, FILE_MAP_WRITE, 0, 0, 4);
     If HWND(FBuffer^) = 0 then
     begin
       HWND(FBuffer^) := Application.Handle;
       Application.Initialize;
       Application.CreateForm(TfrmMain, frmMain);
       Application.Run;
     end
     else
     begin
       FAppHnd := HWND(FBuffer^);
       Windows.SetForegroundWindow(FAppHnd);
     end;
     UnmapViewOfFile(FBuffer);
     CloseHandle(FHandle);
    end.

 
Конференция "Начинающим" » Найти второй экземпляр программы не через имя окна
Есть новые Нет новых   [93030   +19][b:0.001][p:0.005]