AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Kein doppelter Programstart aber Fenster in den Vordergrund
Thema durchsuchen
Ansicht
Themen-Optionen

Kein doppelter Programstart aber Fenster in den Vordergrund

Ein Thema von r_kerber · begonnen am 2. Jan 2004 · letzter Beitrag vom 29. Dez 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#1

Kein doppelter Programstart aber Fenster in den Vordergrund

  Alt 2. Jan 2004, 11:49
Hallo,

ich nutze die folgende Unit um einen doppelten Programmstart zu verhindern:
Delphi-Quellcode:
unit CopyVertragRunOnce;

interface

implementation

uses windows, Dialogs, sysutils, Forms;

var mHandle: THandle; // Mutexhandle

Initialization
  mHandle := CreateMutex(nil, True, PChar(Application.Title));
  // 'xxxxx' Der Anwendungsname ist hier einzutragen
  if GetLastError = ERROR_ALREADY_EXISTS then begin
    // Anwendung läuft bereits
    showMessage('Anwendung läuft bereits!!!!!');
    // Wenn du deine Meldung willst, mach die Klammern weg
    Halt;
  end;

finalization // ... und Schluß
  if mHandle <> 0 then
    ReleaseMutex(mHandle);
end. {Dieter Hirt}
Ich möchte jetzt aber nicht eine Meldung auf den Bildschirm bekommen. Stattdessen soll die Instanz des Programmes, die schon läuft in den Vordergrund gehoben werden. Ich kann dies mit den API-Funktionen SetForegroundWindow oder BringWindowToTop erreichen. Beide benötigen jedoch das Fensterhandle. Gibt es eine Möglichkeit aus dem Mutex irgendwie das Fensterhandle zu ermitteln oder muß ich FindWindow verwenden?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Kein doppelter Programstart aber Fenster in den Vordergr

  Alt 2. Jan 2004, 12:21
Ich denke, es führt kein Weg um FindWindow drumrum.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#3

Re: Kein doppelter Programstart aber Fenster in den Vordergr

  Alt 2. Jan 2004, 12:34
Und wellche Funktion nehme ich zum in den Vordergrund bringen. Bei mir passiert nämlich nichts. Kann auch sein, das ich die falschen Werte für class name bzw. window name verwende.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Kein doppelter Programstart aber Fenster in den Vordergr

  Alt 2. Jan 2004, 12:35
Zeig mal Code. Zum Nachvorneholen würde ich SetWindowPos nehmen mit HWND_TOP als zweiten Parameter.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#5

Re: Kein doppelter Programstart aber Fenster in den Vordergr

  Alt 2. Jan 2004, 12:36
Schau mal ins Attachment.
Angehängte Dateien
Dateityp: zip tpboneinstance.zip (5,0 KB, 38x aufgerufen)
Thomas
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Kein doppelter Programstart aber Fenster in den Vordergr

  Alt 2. Jan 2004, 12:37
Moin Rainer,

Du könntest auch, mittels RegisterWindowMessage, eine eigene Message für Dein Programm erzeugen, die Du dann mittels Handle HWND_BROADCAST an alle Top Level Windows verschickst.
Die laufende Instanz kann sich dann selber in den Vordergrund holen, sobald es diese Message erhält.

Als Messagestring solltest Du Dir am besten eine GUID von der IDE generieren lassen, damit die Message auch eindeutig wird, und das Registrieren nicht fehlschlägt.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#7

Re: Kein doppelter Programstart aber Fenster in den Vordergr

  Alt 2. Jan 2004, 12:40
Mit SetWindowPos ändere ich doch auch die Fensterkoordinaten und -größe.
Hier jetzt der aktuelle Code der Unit:
Delphi-Quellcode:
unit CopyVertragRunOnce;

interface

implementation

uses windows, Dialogs, sysutils, Forms;

var
  mHandle: THandle; // Mutexhandle
  hWindow: HWND;

Initialization
  mHandle := CreateMutex(nil, True, PChar(Application.Title));
  // 'xxxxx' Der Anwendungsname ist hier einzutragen
  if GetLastError = ERROR_ALREADY_EXISTS then begin
    // Anwendung läuft bereits
    hWindow := FindWindow('TApplication', 'CopyVertrag');
// BringWindowToTop(hWindow);
    SetForegroundWindow(hWindow);
// showMessage('Anwendung läuft bereits!!!!!');
    // Wenn du deine Meldung willst, mach die Klammern weg
    Halt;
  end;

finalization // ... und Schluß
  if mHandle <> 0 then
    ReleaseMutex(mHandle);
end. {Dieter Hirt}
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#8

Re: Kein doppelter Programstart aber Fenster in den Vordergr

  Alt 2. Jan 2004, 12:44
Zitat:
Mit SetWindowPos ändere ich doch auch die Fensterkoordinaten und -größe.
Wenn du die richtigen Parameter setzt, dann nicht. SetWindowPos ---> F1!
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#9

Re: Kein doppelter Programstart aber Fenster in den Vordergr

  Alt 2. Jan 2004, 12:53
Zitat von toms:
Wenn du die richtigen Parameter setzt, dann nicht. SetWindowPos ---> F1!
Man sollte die OH vollständig lesen Bringt aber trotzdem nichts.
@toms: Ist das wirklich so aufwändig?
  Mit Zitat antworten Zitat
Rumpi

Registriert seit: 26. Aug 2003
Ort: Berlin
72 Beiträge
 
#10

Re: Kein doppelter Programstart aber Fenster in den Vordergr

  Alt 2. Jan 2004, 13:48
Hallo alle zusammen,

alles Gute fürs Neue Jahr.

Delphi-Quellcode:

// ab damit in deine Tools.pas oder so

function ForceForegroundWindow(hwnd: THandle): boolean;
const
  SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
  SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
  ForegroundThreadID: DWORD;
  ThisThreadID : DWORD;
  timeout : DWORD;
begin
  if IsIconic(hwnd) then
    ShowWindow(hwnd, SW_RESTORE);
  if GetForegroundWindow = hwnd then
    Result := true
  else
  begin
  // Windows 98/2000 doesn't want to foreground a window when some other
  // window has keyboard focus

    if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
       ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
       ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and
       (Win32MinorVersion > 0)))) then
    begin
      // Code from Karl E. Peterson, [url]www.mvps.org/vb/sample.htm[/url]
      // Converted to Delphi by Ray Lischner
      // Published in The Delphi Magazine 55, page 16

      Result := false;
      ForegroundThreadID :=
      GetWindowThreadProcessID(GetForegroundWindow,nil);
      ThisThreadID := GetWindowThreadPRocessId(hwnd,nil);
      if AttachThreadInput(ThisThreadID, ForegroundThreadID, true) then
      begin
        BringWindowToTop(hwnd); // IE 5.5 related hack
        SetForegroundWindow(hwnd);
        AttachThreadInput(ThisThreadID, ForegroundThreadID, false);
        Result := (GetForegroundWindow = hwnd);
      end;
      if not Result then
      begin
        // Code by Daniel P. Stasinski

        SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
        SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),
        SPIF_SENDCHANGE);
        BringWindowToTop(hwnd); // IE 5.5 related hack
        SetForegroundWindow(hWnd);
        SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0,
        TObject(timeout), SPIF_SENDCHANGE);
      end;
    end
    else
    begin
      BringWindowToTop(hwnd); // IE 5.5 related hack
      SetForegroundWindow(hwnd);
    end;

    Result := (GetForegroundWindow = hwnd);
  end;
end; { ForceForegroundWindow }


....


var
  hW : hWnd;

  ....

  hW := FindWindowEx( 0,0,'TApplication', 'Deine Name den du suchst' );
  if IsWindow(hW ) then
  begin
    //...
    Result := ForceForegroundWindow( hW );
    exit;
  end;

  // Bau deinen Mutex bitte mit ein
....
Ich hoffe das Hift dir Weiter

mfg Rumpi
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:27 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