-
Дело в том, что в названии можем быть имя открытого файла. Можно при запуске второго экземпляра найти первый (но не по имени) ?
-
-
Mutex - жеж
-
Mutex ответит на вопрос, запущен второй экземпляр или нет. А найти окно и активировать его или послать в него команду всё равно придётся.
-
На помощь может придти разделяемая память
-
Подскажите где я торможу. Или не правильно отсылаю сообщение или не правильно ловлю.
program Project1;
uses
Forms,
Windows,
Dialogs,
Messages,
Unit1 in 'Unit1.pas' ;
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
public
procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
end;
var
Form1: TForm1;
implementation
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.
-
> Подскажите где я торможу
> SendMessage(HW, WM_SYSCOMMAND, SC_RESTORE, 0);
Тут
В Application.OnMessage попадают только сообщения, посланные по PostMessage. Кроме того, раз ты обрабатываешь сообщение в отдельном обработчике, посылай не стандартное, а свое, типа WM_USER + сколько_то
-
> 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.
|