AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Eigene Anwendung finden und nach vorne setzen
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Anwendung finden und nach vorne setzen

Ein Thema von Jelly · begonnen am 6. Aug 2005 · letzter Beitrag vom 23. Aug 2005
Antwort Antwort
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#1

Eigene Anwendung finden und nach vorne setzen

  Alt 6. Aug 2005, 19:40
Ich möchte vermeiden, dass meine Anwendung 2 mal gestartet wird. Das klappt auch ganz, habs gemacht wie in diesem Thread beschrieben.

Ich möchte aber nicht einfach vermeiden, dass eine 2. Instanz gestartet wird, sondern dass bei einem 2. Start einfach die bestehende Instanz in den Vordergrund geholt. Die Anwendung kann sich in einigen Fällen auch minimiert nur im Tray zu finden sein, ist vielleicht fürs Problem wichtig...

Wer weiss dazu was?
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: Eigene Anwendung finden und nach vorne setzen

  Alt 6. Aug 2005, 21:26
Du willst wohl folgendes machen : beim 2. Programmstart soll das Programm nicht nur zurück in den Vordergrund geholt werden, sondern besser noch, der Cursor steht auch da wo er vorher auch war ?

Stichwort : CreateSemaphore.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Eigene Anwendung finden und nach vorne setzen

  Alt 8. Aug 2005, 10:26
Zitat von Hansa:
Stichwort : CreateSemaphore.
Ja, im oben benutzten Code gehe ich ja auch den Weg über CreateSemaphore. Ein 2. Start der Anwendung wird dabei unterbunden. Ich will aber noch zusätzlich, die bereits laufende Anwendung in den Vordergrund bringen. Dazu brauch ich aber dessen Handle. Und da liegt mein Problem. Den Weg über FindWindow kann ich leider nicht einschlagen, weil die Caption der Anwendung nicht statisch ist... Ich wollte irgendwie was mit OpenSemaphore machen, aber ich kriegs nicht gebacken.
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#4

Re: Eigene Anwendung finden und nach vorne setzen

  Alt 8. Aug 2005, 10:51
eine Variante wäre:
mit MSDN-Library durchsuchenRegisterWindowMessage eine für Dein Programm eindeutige Window-Message registrieren und danach eine solche per MSDN-Library durchsuchenPostMessage mit HWND_BROADCAST an alle Fenster zu senden, wobei jedoch nur Deine Anwendung diese versteht (hoffentlich) und entsprechend reagiert...
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Eigene Anwendung finden und nach vorne setzen

  Alt 8. Aug 2005, 10:58
Habe eben eine Lösung gefunden, und will sie euch nicht vorenthalten.

Delphi-Quellcode:
unit OneInst;

interface

{ Make a call to this procedure in your project source
  immediately before the first call to CreateForm.
  That should ensure it is after the Application.Title
  assignment that can muck up the logic.

  If you haven't set an application title yet, then
  do so to ensure this works }


procedure EnsureSingleInstance (MyGUID : string) ;

implementation

uses
  WinTypes, WinProcs, Forms, SysUtils, Messages;

procedure EnsureSingleInstance (MyGUID : string) ;
var
  Wnd: HWnd;
  WndClass, WndText: array[0..255] of char;
begin
{$ifdef Win32}
  { Try and create a semaphore. If we succeed, then check }
  { if the semaphore was already present. If it was }
  { then a previous instance is floating around. }
  { Note the OS will free the returned semaphore handle }
  { when the app shuts so we can forget about it }
  if (CreateSemaphore(nil, 0, 1,
        PChar(MyGUID)) <> 0) and
     (GetLastError = Error_Already_Exists) then
{$else}
  if HPrevInst <> 0 then
{$endif}
  begin
    Wnd := GetWindow(Application.Handle, gw_HWndFirst);
    while Wnd <> 0 do
    begin
      { Look for the other TApplication window out there }
      if Wnd <> Application.Handle then
      begin
        { Check it's definitely got the same class and caption }
        GetClassName(Wnd, WndClass, Pred(SizeOf(WndClass)));
        GetWindowText(Wnd, WndText, Succ(Length(Application.Title)));
        if (StrPas(WndClass) = Application.ClassName) and
           (StrPas(WndText) = Application.Title) then
        begin
          { This technique is used by the VCL: post }
          { a message then bring the window to the }
          { top, before the message gets processed }
          PostMessage(Wnd, wm_SysCommand, sc_Restore, 0);
{$ifdef Win32}
          SetForegroundWindow(Wnd);
{$else}
          BringWindowToTop(Wnd);
{$endif}
          Halt
        end
      end;
      Wnd := GetWindow(Wnd, gw_HWndNext)
    end
  end
end;

end.
Der Aufruf im Quellcode des Projektes:

Delphi-Quellcode:
program Meinenwendung;



uses
  windows,
  dialogs,
  Forms,
  ...,
  OneInst ;

{$R *.res}

const
  MyGUID = '{79534BF6-900D-4FD8-BA5B-A3E327A70332}';
begin
  Application.Initialize;
  Application.Title := 'Titel';

  EnsureSingleInstance (MyGUID) ;

  Application.CreateForm(TfrmMain, frmMain);
  ... Application.Run;
end.
  Mit Zitat antworten Zitat
Benutzerbild von TeronG
TeronG

Registriert seit: 19. Jul 2004
Ort: München
960 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Eigene Anwendung finden und nach vorne setzen

  Alt 23. Aug 2005, 12:58
Frage ist zwar schon beantwortet aber Just4Info: LMDOneInstance (ist bei Delphi teilweise schon dabei) macht das auch.
龍 Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:33 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