Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi AcroPdf rechtsklick verhindern (https://www.delphipraxis.net/163947-acropdf-rechtsklick-verhindern.html)

froschprinz 23. Okt 2011 09:50


AcroPdf rechtsklick verhindern
 
Hallo zusammen,

ich habe ein Problem. Ich habe ein Form mit der ActiveX Komponente AcroPDF. Da der Benutzer nichts machen soll auser lesen und scrollen habe ich alle Leisten erfolgreich ausgeblendet. Nur den Rechtsklick kann ich nicht verhindern.
Ich habe es bisher mit ApplicationEvents versucht:

Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if (Msg.Message = WM_RBUTTONDOWN) or (Msg.Message = WM_RBUTTONDBLCLK) then
   begin
     beep;
     Handled :=IsChild(AcroPDF1.Handle, Msg.hwnd);
   end;
end;
Aber es funktioniert so nicht - des Beep wird nicht bei einem Rechtsklick ausgeführt.

Habt ihr da 'ne Idee????

Bummi 23. Okt 2011 10:17

AW: AcroPdf rechtsklick verhindern
 
eigentlich handelt es sich um eine fremde Anwendung, die bei Dir gedockt dargestellt wird.
Es ist die Frage ob Du an das "Windowproc" der darstellenden Komponente herankommst, oder ob Du Dich relativ in die MouseEvents hooken musst. Hier bin ich aber absolut nicht firm.

froschprinz 23. Okt 2011 18:43

AW: AcroPdf rechtsklick verhindern
 
Ich denke auch, dass es über einen Moushook gehen könnte. Aber da verstehe ich leider auch nix davon.
Hat jemand den Quellcode für eine Hook dll, die einen Rechtsklick der Mouse verhindert (nicht weiterleitet)?

himitsu 23. Okt 2011 19:53

AW: AcroPdf rechtsklick verhindern
 
Wie wäre es, wenn du einfach eine transparente Komponente über das PDF-Dingens legst, alles Mausereignisse abfängst und nur die Gewollten an das PDF-Teil weiterleitest?

Man könnte auch das PDF auf ein Bitmap zeichnen lassen und zeigt Dieses dann an.

froschprinz 23. Okt 2011 20:09

AW: AcroPdf rechtsklick verhindern
 
Über ein AcroPDF kann mann leider nichts legen - Images und Co treten immer dahinter zurück.

Wie mann eine PDF auf ein Bitmap legt, weis ich nicht. Dann funktioniert das scrollen aber auch nicht mehr.

omata 23. Okt 2011 20:59

AW: AcroPdf rechtsklick verhindern
 
Zitat:

Zitat von himitsu (Beitrag 1132078)
Man könnte auch das PDF auf ein Bitmap zeichnen lassen und zeigt Dieses dann an.

Wie geht das konkret? Geht das mit der AcroPDF-Komponente? Oder meinst du das mit Ghostscript umrendern?

Wäre toll, wenn du das nochmal genauer erklären könntest.

Furtbichler 24. Okt 2011 06:44

AW: AcroPdf rechtsklick verhindern
 
Also Quelltext für Mousehooks findest Du über Googel zuhauf. Könnte aber sein, das Du einen globalen Mousehook benötigst. Und der geht nur mit einer DLL.

Luckie 24. Okt 2011 09:04

AW: AcroPdf rechtsklick verhindern
 
Wieso denn global? Er braucht es doch nur für seine Anwendung oder?

himitsu 24. Okt 2011 09:35

AW: AcroPdf rechtsklick verhindern
 
Zitat:

Zitat von Luckie (Beitrag 1132140)
Wieso denn global? Er braucht es doch nur für seine Anwendung oder?

(Nur) Für den PDF-Reader.

Wie schon erwähnt, ist das eine externe Anwendung (man schaue gerne mal in den Taskmanager) welche ihre Form "nur" bei seiner Anwendung eingebettet hat.
Die ganze Messagebehandlung dieser Form verbleibt aber dennoch in der anderen Anwendung.

Bernhard Geyer 24. Okt 2011 09:46

AW: AcroPdf rechtsklick verhindern
 
Zitat:

Zitat von himitsu (Beitrag 1132148)
Wie schon erwähnt, ist das eine externe Anwendung (man schaue gerne mal in den Taskmanager) welche ihre Form "nur" bei seiner Anwendung eingebettet hat.

Dieser blödsinn ist glücklicherweise Geschichte. Ab V9/V10 wird keine externe App mit Fenstereinbeddung gestartet sondern das ActiveX mit der Programmlogik ist komplett eingebettet.

Sieht man auch daran:

AcroRd32.dll 24 MB
AcroRd32.exe 1,5 MB

Jetzt reicht es bei einem Amoklaufenden Acrobat nur noch die Exe abzuschießen und nicht noch nach Arcobat-Exe's im Taskmanager zu suchen :-)

Luckie 24. Okt 2011 09:57

AW: AcroPdf rechtsklick verhindern
 
Zitat:

Zitat von himitsu (Beitrag 1132148)
Zitat:

Zitat von Luckie (Beitrag 1132140)
Wieso denn global? Er braucht es doch nur für seine Anwendung oder?

(Nur) Für den PDF-Reader.

Wie schon erwähnt, ist das eine externe Anwendung (man schaue gerne mal in den Taskmanager) welche ihre Form "nur" bei seiner Anwendung eingebettet hat.
Die ganze Messagebehandlung dieser Form verbleibt aber dennoch in der anderen Anwendung.

Wer macht denn so ein Blödsinn? Ich dachte das wäre ein einfaches ActiveX Objekt in seiner Anwendung.

himitsu 24. Okt 2011 10:01

AW: AcroPdf rechtsklick verhindern
 
Das kommt drauf an, z.B. das Acrobat-Plugin im FF scheint dennoch die EXE zu sein.

Eine PDF dort aufgemacht, sind sofort zwei AcroRd32.exe zu finden.


PS: Wenn die DLL ein Out-Of-Process-Server wäre, dann würde die Aussage dennoch stimmen. :angle2:

Bernhard Geyer 24. Okt 2011 10:06

AW: AcroPdf rechtsklick verhindern
 
Zitat:

Zitat von himitsu (Beitrag 1132162)
Das kommt drauf an, z.B. das Acrobat-Plugin im FF scheint dennoch die EXE zu sein.

Eine PDF dort aufgemacht, sind sofort zwei AcroRd32.exe zu finden.

Kann ich mit V10 von Acrobat nicht nachvollziehen. Evt. ohne deinstallation von älteren Versionen hochgezogen oder noch alte Version?
Bei Adobe zerschießt ein Versionsupdate ohne vorherige Deinstallation regelmäßig die Installation.

Bernhard Geyer 24. Okt 2011 10:08

AW: AcroPdf rechtsklick verhindern
 
Zitat:

Zitat von Luckie (Beitrag 1132159)
Wer macht denn so ein Blödsinn? Ich dachte das wäre ein einfaches ActiveX Objekt in seiner Anwendung.

Machen einige. Bei einer verwendeten Komponente ist das sogar von Vorteil da man damit auch eine 64-App in einer 32-Bit App einbedden kann da nur der ActiveX-Wrapper als 32-Bit Version vorliegen muss.

himitsu 24. Okt 2011 10:13

AW: AcroPdf rechtsklick verhindern
 
Keine Ahnung. Mein Reader X meint er wäre aktuell. Aber soweit ich mich erinnere, hatte ich hier den X direkt installiert. (vor paar Monaten alles neu draufgemacht)

Wobei der im Browser eh nervt, wenn er sich mal wieder die Mausereignisse (z.B. Scrollen) grabscht, obwohl er eigentlich auf dem inaktiven Tab nur rumgammeln sollte.


Zitat:

Machen einige. Bei einer verwendeten Komponente ist das sogar von Vorteil da ...
Und Probleme in der Fremdanwendung lassen nicht unbedingt gleich die eigene Anwendung mit verrecken.

omata 24. Okt 2011 18:01

AW: AcroPdf rechtsklick verhindern
 
@himitsu: Schade, dass du auf meine Frage nicht eingegangen bist.

himitsu 24. Okt 2011 21:04

AW: AcroPdf rechtsklick verhindern
 
Dafür müßte ich wissen, wie man die Beiden einbindet, um den Unterschied zu kennen. :stupid:
Ich seh halt nur öfters, daß einige Programme irgendwie die EXE nutzen.

Ich könnte ja mal nachsehn, was bei unserem Programm eingebunden wird (EXE oder DLL) ... daß wie weiß ich noch in etwa, wo das stand.

froschprinz 25. Okt 2011 15:43

AW: AcroPdf rechtsklick verhindern
 
o.k.
ich habs mit einem Moushook gelöst. Sobald die PDF aufgerufen wird starte ich den Hook und nach dem Schließen beende ich ihn wieder. Funktioniert ganz gut. Dies könnte evt. auch für andere Anwendungen brauchbar sein, wenn ich sicher(und Systhemweit) den Rechtsklick verhindern will.

Der Quelltext der Dll ist einfacher als gedacht:

Delphi-Quellcode:
library MouseHook;

uses
  Windows, Messages;

{$J+}
const
  Hook: HHook = 0;
{$J-}


{$R *.res}

function HookProc(nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall;
begin

 if (MsgID = WM_RBUTTONDOWN) or (MsgID = WM_RBUTTONUP) then
 begin
  //tue nichts
 end else begin
   Result := CallNextHookEx(Hook,nCode,MsgID,Data);
 end;
end;

procedure HookMouse; stdcall;
begin
  if Hook = 0 then Hook:=SetWindowsHookEx(WH_MOUSE,@HookProc,HInstance,0);
end;

procedure UnHookMouse; stdcall;
begin
  UnhookWindowsHookEx(Hook);
  Hook:=0;
end;

exports
  HookMouse, UnHookMouse;
begin

end.

Luckie 25. Okt 2011 15:49

AW: AcroPdf rechtsklick verhindern
 
Kann es sein, dass du damit alle rechts Klicks in allen Anwendungen verhinderst? Ich hoffe du sagst das den Benutzern, wenn das der Fall ist. Denn ich glaube, ich würde irre werden, bis ich herausfinde, dass es an deinem Programm liegt. Und dann würdest du von mir eine ziemlich böse E-Mail bekommen. ;)

froschprinz 25. Okt 2011 16:03

AW: AcroPdf rechtsklick verhindern
 
Danke für den Hinweis.Das siehst du genau richtig!

Aber das ist ja gerade der Sinn der Sache.

Meine Anwendung ist eine, die vom Benutzer nicht verlassen werden kann(darf). Sie läuft auf öffentlichen Terminals. Darum will ich ja den Rechtsklick verhindern, da sonst der böse Benutzer des Kontextmenü aufrufen und blödes Zeug anstellen darf!

himitsu 25. Okt 2011 16:53

AW: AcroPdf rechtsklick verhindern
 
Kennst du die Kontextmenütaste?
Wozu die Maus verschwenden, wenn man eine Tastatur hat. :roll:

ASM 25. Okt 2011 17:13

AW: AcroPdf rechtsklick verhindern
 
Wenn es nur darum geht, den Rechtsklick auf die AcroPDF im eigenen Programm zu verhindern, dann geht das doch (ohne das höchst zweifelhaft über einen globalen Mousehook erzwingen zu wollen) mit Hilfe eines tranparenten Panels, welches deckungsgleich über das AcroPDF gelegt ist und die Mausklicks abfängt. So etwas hat doch bereits himitsu vorgeschlagen.

Es gibt mehrere Komponenten transparenter Panels, mit denen das funktioniert, und zwar problemlos auch hinsichtlich von Grafiken in der PDF. Eine solche Komponente ist z.B. als Unit TransparentPanel veröffentlicht als eine der Antworten bei http://www.experts-exchange.com/Prog..._20950505.html.
Eine andere (Unit TransPanel.pas von Mik Tran) stammt noch aus der Steinzeit von Delphi (1998), arbeitet jedoch immer noch fehlerfrei mindestens unter Delphi 7, und sie ist mit Sicherheit irgendwo im Netz noch zu finden (notfalls im Webarchiv).

Einziger Nachteil ist, dass dann naturlich auch der Linksklick auf die AcroPDF nicht mehr funktioniert. Aber die davon abhängigen Aktionen sind leicht zu erreichen, indem man - wie z.B. für das Zoomen - auf der eigenen Form entsprechende Buttons installiert, die genau diese Aktionen mit Hilfe des Zugriffs auf die entsprechenden Funktionen der AcroPDF auslösen, also z.B. für das Zoomen:
Code:
 AcroPDF1.setZoom(percent: Single);
Und für das Blättern der PDF hält man einfach den Scrollbalken der AcroPDF frei vom TransparentPanel:
Code:
procedure TForm1.FormCreate(Sender: TObject);
var
  ScrollbarWidth: Integer;
begin
 ScrollbarWidth := GetSystemMetrics(SM_CXVSCROLL);
 with TransparentPanel1 do
  begin
    left := AcroPDF1.left;
    top := AcroPDF1.top;
    height := AcroPDF1.height;
    width := AcroPDF1.width - ScrollbarWidth;
  end;
end;

froschprinz 26. Okt 2011 16:59

AW: AcroPdf rechtsklick verhindern
 
Mein Programm ist auf TouchPanel installiert. Da hat mann keine Tastatur und kommt somit auch nicht an das Kontextmenü.

Der Tip mit dem transparenten Panel ist ganz gut, hat jedoch einen Nachteil: Eine AcroPDF lässt sich bequem mit dem Finger scrollen (ohne Scrollbalken). Einfach den Touchscreen berühren und Finger nach oben oder unten bewegen. Das geht dann leider auch nicht mehr.
Ich komme leider nicht an diese Unit heran, da ich nicht Mitglied von www.experts-exchange.com bin. Kann mir jemand diese Unit schicken?

Übrigens, kann mann überhaupt ein Panel über eine AcroPDF legen? Bei mir bleibt immer der AcroPDF im Vordergrund?

Warum habt ihr so eine Abneigung gegen einen Hook. Das würde ich gerne verstehen????

Bummi 26. Okt 2011 17:15

AW: AcroPdf rechtsklick verhindern
 
ich komme auch nicht dran, aber der Inhalt dürfte weitestgehend diesem Konstrukt entsprechen:
ich habe es mal mit TWebbrowser getestet, da ich den Acrobat derzeit nicht installiert habe, Du kannst es transparent abdecken, in diesem Fall funktioniert das transparente Panel sogar brauchbar, für den tagtägliche Einsatz ist es jedoch ungeeignet da es beim stapeln mit anderen VCL Komponenten zu Darstellungsfehlern kommt.

Delphi-Quellcode:
  TPanel=Class(ExtCtrls.TPanel)
    Procedure CreateParams( Var params: TCreateParams ); override;
    Procedure WMEraseBkGnd( Var msg: TWMEraseBkGnd );message WM_ERASEBKGND;
  End;


{ TPanel }

procedure TPanel.CreateParams(var params: TCreateParams);
begin
  inherited;
inherited CreateParams( params );
params.ExStyle := params.ExStyle or WS_EX_TRANSPARENT;
end;

procedure TPanel.WMEraseBkGnd(var msg: TWMEraseBkGnd);
begin
SetBkMode( msg.DC, TRANSPARENT );
msg.result := 1;
end;

ASM 27. Okt 2011 14:16

AW: AcroPdf rechtsklick verhindern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hatte nicht bedacht, dass auf die von mir genannte Unit TransparentPanel bei experts-exchange nicht frei zugegriffen werden kann. An sich ist der Code dieser Unit aber - bis auf das grundsätzliche Copyright - keinen anderen Restriktionen unterworfen worden. Trotzdem möchte ich ihn ungern hier öffentlich posten.

Stattdessen, falls trotz Bummis Beitrag noch Interesse besteht: Anbei mit Hilfe der ebenfalls erwähnten Komponente TTranspanel von Mik Tran (1998!) mein einfaches Beispiel zur Benutzung von AcroPDF gemäß meiner oben geposteten Beschreibung. Das ZIP-Archiv enthält Quellcode und kompiliertes Programm (kompiliert mit D7 bei 1280x1024 Auflösung, 96 dpi).

froschprinz 27. Okt 2011 20:04

AW: AcroPdf rechtsklick verhindern
 
Vielen Dank für Eure Anrworten Brummi und ASM.
Interessante Komponente die TransPanel. Habe es mal ausprobiert mit meiner Anwendung. Scheint zu funktionieren. Was mich etwas stutzig macht ist dass die ViewPDF.exe von ASM bei mir nicht läuft (unbekannter Fehler).
Auch deine ViewPDF.dpr bekomme ich nicht wirklich zum laufen, da mir z.B. die Komponente TrkBar fehlt.
Sind irgendwelche Probleme mit der TransPanel-Komponente bekannt?
Falls es Euch interessiert, woran ich arbeite: www.cabito.net

ASM 27. Okt 2011 23:06

AW: AcroPdf rechtsklick verhindern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Auch die Komponente TrkBar ist schon uralt (Freeware von Ray Konopka), aber funktioniert ebenso wie die Transpanel unter Delphi 7 immer noch problemlos. Ich reiche TrkBar hier als Anhang nach.

@froschprinz: Warum das kompilierte Programm bei Dir nicht läuft, ist mir rätselhaft. Ich habe es zwar wie alle meine Programme routinemäßig gegen Hacking gesichert und mit UPX gepackt, aber habe bisher damit noch nie Probleme bekommen, und alle laufen unter WinXP und Win7 auf mehreren Rechnern.

Mit Hilfe der Komponenten Transpanel und Trkbar sollte es Dir aber gelingen, mein Beispielprojekt auf Deinem Rechner neu zu kompilieren.

froschprinz 30. Okt 2011 07:54

AW: AcroPdf rechtsklick verhindern
 
Leider habe ich auch mit dem TrkBar deine ViewPDF nicht zum Laufen bekommen. Beim Öffnen der ViewPDF.dpr bringt Delphi erst dass die ViewPDF.res nicht gefunden wurde und dann Fehler beim Erzeugen von Formular :Unbekannter Fehler.
Kann es sein, dass die TrkBar Komponente nicht mit Windows7 zusammenarbeitet? Seit ich diese Komponente eingefügt habe, schließt Delphi auch manchmal nicht korrekt sondern bringt endlose Schutzverletzungen?

Aber zu meinem eigentlichen Problem (AcroPdf rechtsklick verhindern) bin ich eigentlich schon zufriedengestellt.
Ich habe 2 Optionen:
1. Wenn ich das Scrollen mittels Gestik am Touchscreen aufrechterhalten will, nehme ich den Hook (es sei den mir sagt jemand, warum ich das nicht machen sollte)
2. Wenn ich 1 nicht benötige, leistet der TransPanel gute Dienste.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 Uhr.

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-2025 by Thomas Breitkreuz