Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ärger mit Shellexecute (https://www.delphipraxis.net/210698-aerger-mit-shellexecute.html)

KodeZwerg 1. Jun 2022 10:30

AW: Ärger mit Shellexecute
 
Zitat:

Zitat von Delbor (Beitrag 1506601)
Den Code von CodeZwerg werd ich mir mal in eine Unit/Klasse packen.

Bin gespannt was dabei rauskommt, bei meiner Variante ist der ClassName völlig egal da ich über die erzeugte ProcessID das Fensterhandle versuche zu holen.
Diese Methodik funktioniert zu 100% immer zuverlässig solange das "ExecFile" kein "Wrapper" für andere Executables ist (Programm A lädt beim start Programm B oder Fenster wird in DLL erzeugt... etc) bzw solange die ProcessID ein Fenster besitzt.

Wenn Du noch Fragen dazu haben solltest, ich hoffe ich kann Dir weiterhelfen.

Delphi.Narium 1. Jun 2022 10:50

AW: Ärger mit Shellexecute
 
Muss es unbedingt Ashampo zur Anzeige von PDF-Dateien sein?

Wenn nein: Bei mir ist seit 'ner Weile Sumatra im Einsatz. Klappt so gut, dass es mir nicht mher auffällt, dass ich da "was fremdes" in meine Programme einbette.

Zuerst wird geprüft, ob Sumatra vorhanden ist, wenn ja, wird es genutzt. Sollte es nicht gefunden werden, wird es mit dem AcrobatReader versucht. Den Teil kann man aber auch entfernen, wenn die Nutzung vom Acrobat ausgeschlossen werden soll.

Da ich nur Delphi 7 habe, wirst Du im folgenden Quelltext vermutlich einige Anpassungen vornehmen müssen.

Zuerst die DFM:
Delphi-Quellcode:
object fmPDFVorschau: TfmPDFVorschau
  Left = 476
  Top = 60
  Width = 249
  Height = 138
  Caption = 'PDF-Vorschau'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  KeyPreview = True
  OldCreateOrder = False
  OnCreate = FormCreate
  OnKeyDown = FormKeyDown
  OnResize = FormResize
  OnShow = FormResize
  PixelsPerInch = 96
  TextHeight = 13
  object pnPDF: TPanel
    Left = 0
    Top = 0
    Width = 241
    Height = 111
    Align = alClient
    BevelOuter = bvNone
    TabOrder = 0
  end
end
und dann die dazugehörige Unit:
Delphi-Quellcode:
unit uPDFVorschau;

interface

uses
  AcroPDFLib_TLB,
  Forms,
  Classes,
  Controls,
  ExtCtrls;

type
  TfmPDFVorschau = class(TForm)
    pnPDF: TPanel;
    procedure FormResize(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormCreate(Sender: TObject);
  protected
    procedure CreateParams(var Params: TCreateParams) ; override;
  private
    { Private-Deklarationen }
    fAcroPDF      : TAcroPDF;
    fPDFFile      : String;
    fUseSumatraPDF : Boolean;
  public
    { Public-Deklarationen }
    procedure LoadPDF(APdfFile : String);
    procedure LoadArcoPDF;
    procedure LoadSumatraPdF;
    property PDFFile : String read fPDFFile;
    property UseSumatraPDF : Boolean read fUseSumatraPDF write fUseSumatraPDF default false;
  end;

var
  fmPDFVorschau: TfmPDFVorschau;

implementation

{$R *.dfm}

uses
  Windows,
  SysUtils,
  ShellAPI;

const
  csCaption = 'PDF-Vorschau - %s';

// Eigenen Button in die Taskbar machen, damit man per STRG+TAB zwischen den
// Fenstern wechseln kann. Der eingebettet Acrobat nimmt sich leider das Recht
// heraus alle Tastaturkürzel zu ignorieren, wenn sie vom Programm sind und
// sich selbst so in den Focus zu setzen, dass man nicht per Mausklick ...
// problemlos mit dem Programm arbeiten kann.
procedure TfmPDFVorschau.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle  := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := 0;
end;

procedure TfmPDFVorschau.FormCreate(Sender: TObject);
begin
  // Das muss ggfls. angepasst werden.
  fUseSumatraPDF := FileExists('.\Lib\SumatraPDF.exe');
end;

procedure TfmPDFVorschau.FormResize(Sender: TObject);
begin
  if not fUseSumatraPDF then begin
    if Assigned(fAcroPDF) then begin
      if fAcroPDF.Visible then begin
        fAcroPDF.LoadFile(fPDFFile);
        fAcroPDF.Update;
      end;
    end;
  end else
  if Assigned(pnPDF) then begin
    pnPDF.Align := alTop;
    Application.ProcessMessages;
    pnPDF.Align := alClient;
  end;
end;

procedure TfmPDFVorschau.LoadPDF(APDFFile : String);
begin
  fPDFFile         := APDFFile;
  Caption          := Format(csCaption,[ChangeFileExt(ExtractFileName(fPDFFile),'')]);
  case fUseSumatraPDF of
    true : LoadSumatraPDF;
    false : LoadArcoPDF;
  end;
end;

procedure TfmPDFVorschau.LoadArcoPDF;
begin
  Screen.Cursor := crHourGlass;
  if Assigned(pnPDF) then pnPDF.Visible := False;
  if not Assigned(fAcroPDF) then begin
    fAcroPDF               := TAcroPDF.Create(Self);
    fAcroPDF.Parent        := Self;
    fAcroPDF.Left          := 0;
    fAcroPDF.Top           := 0;
    fAcroPDF.Width         := Width;
    fAcroPDF.Height        := Height;
    fAcroPDF.TabStop       := False;
    fAcroPDF.Align         := alClient;
    fAcroPDF.ParentShowHint := False;
    fAcroPDF.ShowHint      := True;
    fAcroPDF.TabOrder      := 0;
    fAcroPDF.Visible       := True;
  end;
  fAcroPDF.src := fPDFFile;
  fAcroPDF.LoadFile(fPDFFile);
  Screen.Cursor := crDefault;
  Show;
end;

procedure TfmPDFVorschau.LoadSumatraPDF;
var
  sParam : String;
begin
  Screen.Cursor := crHourGlass;
  if Assigned(fAcroPDF) then fAcroPDF.Visible := False;
  // Caption      := Format(csCaption,[fPDFFile]);
  // -reuse-instance funktioniert nur, wenn immer die gleiche Datei geladen wird,
  // andernfalls entsteht für jede PDF-Datei eine neue Instanz von SumatraPDF.
  // Die Instanzen von SumatraPDF werden beendet, wenn man das Programm beendet.
  // Bei diesem Vorgehen entsteht aber nur eine Instanz von SumatraPDF.
  pnPDF.Free;
  Sleep(1000); // Warten, bis sich SumatraPDF beendet hat.
  pnPDF           := TPanel.Create(Self);
  pnPDF.Parent    := Self;
  pnPDF.Left      := 0;
  pnPDF.Top       := 0;
  pnPDF.Width     := Width;
  pnPDF.Height    := Height;
  pnPDF.BevelOuter := bvNone;
  pnPDF.TabOrder  := 1;
  pnPDF.Align     := alClient;
  pnPDF.Visible   := True;
  sParam          := Format('-lang de -reuse-instance -plugin %d "%s"',[pnPDF.Handle,fPDFFile]);
  ShellExecute(Self.Handle,'open',PAnsiChar('SumatraPDF.exe'),PAnsiChar(sParam),'',sw_normal);
  Screen.Cursor   := crDefault;
  Show;
end;

procedure TfmPDFVorschau.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  case key of 27 : Close; end;
end;

end.

TurboMagic 1. Jun 2022 12:06

AW: Ärger mit Shellexecute
 
Zitat:

Zitat von Delbor (Beitrag 1506601)
Hi zusammen

Ich hab mir gestern abend das von DeddyH vorgeschlagene Wynspy mal 'installiert', aber heute morgen nichts davon vorgefunden, ausser dass mir Windows unter 'Zuletzt neu hinzugefügt' Delphi Alexandria meldet. Das hab ich gestartet und hatte bislang den Eindruck eines gewöhnlichen Delphi-Starts, bin allerdings noch nicht alle Menuepunkte durchgegangen.
Den Code von CodeZwerg werd ich mir mal in eine Unit/Klasse packen.

Gruss
Delbor

Ich glaube nicht, das WinSpy was in der Delphi IDE ist.
Das ist denke ich ein separat aufrufbares Programm, welches einem alle handles usw. anzeigt.

DeddyH 1. Jun 2022 12:31

AW: Ärger mit Shellexecute
 
Einfach auf den Link Klicken, dann sieht man, dass das ein Programm des DP-Mitglieds toms ist ;-)

Delbor 1. Jun 2022 13:27

AW: Ärger mit Shellexecute
 
Hi zusammen

@ Delphi.Narium: Nebst einem kostenpflichtigen Programm, das ich mir schon vor Jahr(-zehnt)en zugelegt habe, habe ich mir noch Ashampo PDF Free zugelegt, womit ich PDFs ausfüllen und sie mit beliebigen, auch benutzerdefinierten Stempeln versehen kann - und die Internethilfe ist in normalem Deutsch ohne jegliches Fachchinesisch abgehalten (..). Das ist für mich der Hauptgrund, warum ich vorerst bei Ashompoo bleiben will.
Für mein Programm hingegen muss es völlig gleichgültig sein, mit welchen fremden Programmen es arbeitet.

@Turbomagic:
Zitat:

Ich glaube nicht, das WinSpy was in der Delphi IDE ist.
Ich dachte auch erst an ein eigenständiges Programm, hab dann aber nichts gefunden ausser eben Delphi Alexandria, das ganz zuoberst in der Startleiste als neu hinzugefügt aufgeführt war/ist. Wenn das die letzte vorgenommenen Installation gewesen wäre... War sie aber nicht: das war Winspy. Und davor mindestens CNPack und GEXPERTS.


Gruss
Delbor

DeddyH 1. Jun 2022 13:57

AW: Ärger mit Shellexecute
 
Der Download ist ein Zip-Archiv, da wird nichts installiert. Du musst also den Ordner öffnen, in den Du entpackt hast und dort die WinSpy.exe starten.

venice2 1. Jun 2022 14:06

AW: Ärger mit Shellexecute
 
Hier!

Andreas13 1. Jun 2022 14:34

AW: Ärger mit Shellexecute
 
Hier ist eine deutlich jüngere Version von Winspy aus dem Jahr 2018: https://sourceforge.net/projects/winspyex/
VirusTotal https://www.virustotal.com meldet allerdings eine Handvoll von Trojanern... :cry:
Bestimmt nur ein Fehlalarm?
Gruß, Andreas

Delbor 1. Jun 2022 14:59

AW: Ärger mit Shellexecute
 
Liste der Anhänge anzeigen (Anzahl: 4)
Hi zusammen

Zitat:

Der Download ist ein Zip-Archiv, da wird nichts installiert. Du musst also den Ordner öffnen, in den Du entpackt hast und dort die WinSpy.exe starten.
Ein Ordner mit Reissverschluss?
Anhang 55129
Nach dem entpacken und "installieren":
Anhang 55130
und der Taskmanager
Anhang 55131

Wie ich den wieder anzeige, ist mir ein Rätsel. Auch das menü des Taskmanagers weiss es nicht:
Anhang 55132
Zumindest, wenn ich richtig gelesen habe.

Was mache ich falsch?

@Andreas13 Habe deinen Beitag eben jetzt gesehen. Danke! Allerdings von wegen Viruse - ich arbeite mit dem windowseigenen Defender.

Gruss
Delbor

TiGü 1. Jun 2022 15:12

AW: Ärger mit Shellexecute
 
Nutze lieber den Window Detective, der kann noch ein bisschen mehr und kann wahlweise per Installer heruntergeladen werden:
https://windowdetective.sourceforge.io/


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz