AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Verhindern eine Anwendung mehrfach zu starten
Thema durchsuchen
Ansicht
Themen-Optionen

Verhindern eine Anwendung mehrfach zu starten

Ein Thema von Moony · begonnen am 6. Mai 2008 · letzter Beitrag vom 15. Jan 2022
 
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#33

AW: Verhindern eine Anwendung mehrfach zu starten

  Alt 13. Jan 2022, 14:40
Hmm..

Das ist die einfachste Lösung, wenn man sicherstellen will, dass ein Programm nur einmal gestartet wird.

Was diese Lösung aber nicht kann:

Die übergebenen Parameter an die erste Instanz weiterreichen, damit diese damit weiterarbeiten kann.

Und genau da liegt ja aktuell das Problem.
Wieso sendest Du dann nicht eine Message an deine andere Instanz?

Z.B. in der DPR (wie oben als Beispiel)

Delphi-Quellcode:
const
  c_ProgStartMutexName = 'MeinProgrammName';



  {Attempt to create a named mutex}
  CreateMutex(nil, false, c_ProgStartMutexName);
  {if it failed then there is another instance}
  if GetLastError = ERROR_ALREADY_EXISTS then
    begin
    {Send all windows our custom message - only our other}
    {instance will recognise it}
    SendMessage(HWND_BROADCAST,
                RegisterWindowMessage(c_ProgStartMutexName),
                0,
                0);
    {Lets quit}
    Halt(0);
  end;
  Application.Initialize;

Dort, im Hauptfenster vorher:

Delphi-Quellcode:
const
  c_ProgStartMutexName = 'MeinProgrammName';

var
 OldWindowProc : Pointer; {Variable for the old windows proc}
 MyMsg : Int64; {custom systemwide message}

function NewWindowProc(WindowHandle : hWnd;TheMessage : LongInt;
  ParamW : LongInt; ParamL : LongInt) : LongInt stdcall;
begin
  if TheMessage = MyMsg then begin
    {Tell the application to restore, let it restore the form}
    SendMessage(Application.handle, WM_SYSCOMMAND, SC_RESTORE, 0);
    SetForegroundWindow(Application.Handle);
    {We handled the message - we are done}
    Result := 0;
    exit;
  end;
  {Call the original winproc}
  Result := CallWindowProc(OldWindowProc, WindowHandle, TheMessage, ParamW, ParamL);
end;

procedure TFormMeineMainForm.FormCreate(Sender: TObject);
begin
  //Register a custom windows message
  MyMsg := RegisterWindowMessage(c_ProgStartMutexName);
  //Set form1's windows proc to ours and remember the old window proc
  OldWindowProc := Pointer(SetWindowLong(FormHauptmenue.Handle, GWL_WNDPROC, LongInt(@NewWindowProc)));
  ..
end;

In diesem Beispiel wird der ersten Instanz einfach nur mitgeteilt, dass sie sich wieder nach vorne bringen soll..
Kannst aber auch eine andere Message oder IPC verwenden, um z.B. deinen Sting zu übergeben.
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz