Показать сообщение отдельно
  #1  
Старый 14.08.2024, 21:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну примеров полно в интернете.
Например, я делаю так:

В 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
Ответить с цитированием