Einzelnen Beitrag anzeigen

Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

ShellExecute und Vordergrund

  Alt 10. Jan 2011, 14:26
Hallo,

zu ShellExecute gibt es eine Menge Themen. Möglicherweise zu viel, als dass ich meine Lösung finden konnte.

Ich habe eine Server-/Client-Anwendung. Üblicher Weise sendet der Server den Clients Pfad + Datei und der Client öffnet das. Es sind meistens OpenOffice-Dateien. Ich benutze daher ShellExecute, weil es mir zu kompliziert ist, in der Registry etc. pp. nach der Verknüpfung für die entsprechenden Dateiendungen zu suchen.

Wir haben bei uns aber auch eine TK-Anlage, die Faxe empfängt und diese unglückseeliger Weise als exe-Dateien ablegt. Genau darin besteht mein Problem:
Ich lasse den Client Pfad + Namen dieser exe-Dateien zukommen und sie werden über ShellExecute ebenfalls gestartet. Nur leider verschwindet das dann angezeigte Fenster der Fax-Anwendung immer hinter dem Fenster meiner Anwendung und es nervt, dieses über die Taskleiste in den Vordergrund holen zu müssen. Ich halte das für einen Fehler im Programm, was mir aber nicht weiterhilft.

Gibt es eine Möglichkeit, dass mit ShellExecute zu machen?

Ich habe jetzt mal ganz plmup folgendes probiert, was aber nicht funktioniert:
Delphi-Quellcode:
Procedure ForceToFront(Value: HWND);
Var
  Th1, Th2 : Cardinal;
Begin
  Th1:=GetCurrentThreadId;
  Th2:=GetWindowThreadProcessId(GetForegroundWindow, nil);
  AttachThreadInput(Th2, Th1, True);
  Try
    SetForegroundWindow(Value);
  Finally
    AttachThreadInput(Th2, Th1, False);
  End;
End;

Procedure TWFOpen.HandleFiles(Sender: TObject);
Var
  S : String;
  Done : Boolean;
  Inst : HInst;
Begin
  Done:=(OpenFiles.Count = 0);
  While Not Done Do
  Begin
    S:=OpenFiles.Strings[0];
    // Alternative:
    // ForceToFront(self.Handle);
    Inst:=ShellExecuteA(self.Handle, 'open', PChar(S), nil, nil,
            SW_SHOWDEFAULT);
    ForceToFront(Inst);
    OpenFiles.Delete(0);
    Done:=(OpenFiles.Count = 0);
  End;
End;
Wenn ich als Alternative das ForceToFront zuvor aufrufe, dann klappt es. Allerdings habe ich dann das Problem, dass damit das Hauptfenster meiner Applikation ebenfalls im Vordergrund ist, was ich nicht will.

Ich habe auch schon herausgefunden, dass Inst nicht dasselbe wie das Fensterhandle ist und es schon deshalb nicht funktionieren kann. Allerdings könnte man meine Frage daher ggf. auch so umformulieren:
Wie komme ich über das von ShellExecute zurückgegebene HInst an das Handle des Fensters heran?

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat