Ну примеров полно в интернете.
Например, я делаю так:
В dpr файле:
Код:
program Project1;
uses ...
{$R *.res}
function AllowSetForegroundWindow(dwProcessId: DWORD): BOOL; stdcall; external 'user32.dll';
function IsSecondCopy : Boolean;
var
hMutex : THandle;
begin
Result := False;
WndMessage := RegisterWindowMessage(PChar(GetMessageName(AppName)));
hMutex := CreateMutex(Nil, True, PChar(GetMutexName(AppName)));
If hMutex<>0 Then
If GetLastError=ERROR_ALREADY_EXISTS Then
Begin
AllowSetForegroundWindow(DWORD(-1));
PostMessage(HWND_BROADCAST,WndMessage,0,0);
Result := True;
End;
end;
begin
If IsSecondCopy Then Halt(0);
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.HookMainWindow(MainForm.HookMessageProc);
Application.Run;
end.
В главной форме:
Код:
const
AppName = 'Password Keeper';
type
TMainForm = class(TForm)
...
public
{ Public declarations }
function HookMessageProc(var Message : TMessage) : Boolean;
end;
...
function TMainForm.HookMessageProc(var Message : TMessage) : Boolean;
begin
Result := False;
If Message.Msg = WndMessage Then
Begin
If WindowState = wsMinimized Then Application.Restore;
Application.BringToFront;
SetForegroundWindow(Self.Handle);
Result := True;
End;
end;
Это по поводу второй копии.
По поводу передачи данных (небольших), надо пользовать сообщение WM_COPYDATA. Код можно посмотреть, например, тут:
https://stackoverflow.com/questions/...ia-wm-copydata