| 

.NET C# Java Javascript Exception

0
Ich zeige innerhalb eines WebBrowser-Controls ein PDF an. Hierbei wird intern der Adobe Reader geladen. Diesen habe ich mit Parametern in der URL so konfiguriert, dass mir keine Möglichkeit mehr bleibt, auf das Dateisystem zuzugreifen. Dies ist eine direkte Vorgabe im Design meiner Anwendung.
Mache ich jedoch einen Rechtsklick auf das angezeigte PDF, habe ich zunächst die Möglichkeit, das Navigationsfenster wieder einzublenden. Nach erneutem Rechtsklick besteht jetzt die Möglichkeit, die Seitenanzeige-Einstellungen zu bearbeiten. Hier gibt es einen Punkt "Speicherort für referenzierte Dateien", der einem via Button "Ordner suchen..." die Möglichkeit gibt, im Dateisystem Ordner anzulegen, zu löschen, umzubenennen usw.
Dies ist so absolut nicht gewünscht, daher würde ich gerne den Rechtsklick innerhalb des Steuerelements unterdrücken. Allerdings sind für das WebBrowser-Control keinerlei Mouse-Events verfügbar.

Gibt es hier eine einfache Lösung, um die Rechtsklicks nicht weiter an das WebBrowser-Control weiterzugeben?
News:
16.09.2009
bbohac 21 1 3
4 Antworten
2
Hi,
das dürfte nichts mit dem WebBrowser-Control zu tun haben, weil der Webbrowser sozusagen den Acrobat Reader lädt und dort das rechtsklickfenster angezeigt wird.

Soweit ich weiß kann man aber den Reader per Javascript konfigurieren. Dazu muß man eine Datei ins Dateisystem legen.
Beispiel:
C:\Program Files\Adobe\Acrobat 7.0\Reader\Javascripts\config.js
mit folgendem Inhalt:
app.hideToolbarButton ("File");

app.hideToolbarButton ("Open");
app.hideToolbarButton ("ADBE:SPDR:OpStatTlButton");
app.hideToolbarButton ("Save");
app.hideToolbarButton ("SaveFileAs");
app.hideToolbarButton ("Print");
app.hideToolbarButton ("AddToOrganizer");
app.hideToolbarButton ("Organizer");
app.hideToolbarButton ("AddAttachments");

app.hideToolbarButton ("AddAttachments");
app.hideToolbarButton ("Annots:Tool:FileAttachment");

app.hideToolbarButton ("Annots:Tool:FileAttachment");
app.hideToolbarButton ("AcroSendMail:SendMail");
app.hideToolbarButton ("FindDialog");
app.hideToolbarButton ("endDialogGroup");

app.hideToolbarButton ("UndoRedo");
app.hideToolbarButton ("Spelling:Tool:SpellTool");
app.hideToolbarButton ("Undo");
app.hideToolbarButton ("Undo");
app.hideToolbarButton ("Redo");
app.hideToolbarButton ("Copy");
app.hideToolbarButton ("endUndoRedoGroup");
app.hideToolbarButton ("endCopyGroup");

app.hideToolbarButton ("Tasks");
app.hideToolbarButton ("NewDocumentTask");
app.hideToolbarButton ("CommentTask");
app.hideToolbarButton ("Initiate");
app.hideToolbarButton ("SecureTask");
app.hideToolbarButton ("SignTask");
app.hideToolbarButton ("FormTasks");

app.hideToolbarButton ("BasicTools");

app.hideToolbarButton ("Hand");
app.hideToolbarButton ("Select");
app.hideToolbarButton ("SelectGraphics");
app.hideToolbarButton ("endSelectToolsGroup");


app.hideToolbarButton ("Data");
app.hideToolbarButton ("ObjectData");
app.hideToolbarButton ("Viewing");
app.hideToolbarButton ("ZoomIn");
app.hideToolbarButton ("ZoomIn");
app.hideToolbarButton ("ZoomOut");
app.hideToolbarButton ("ZoomDrag");
app.hideToolbarButton ("Loupe");
app.hideToolbarButton ("Zoom100");
app.hideToolbarButton ("FitPage");
app.hideToolbarButton ("FitVisible");
app.hideToolbarButton ("ZoomViewOut");
app.hideToolbarButton ("ZoomTo");
app.hideToolbarButton ("ZoomViewIn");

app.hideToolbarButton ("Rotate");
app.hideToolbarButton ("RotateCW");
app.hideToolbarButton ("RotateCW");
app.hideToolbarButton ("RotateCCW");
app.hideToolbarButton ("endRotateViewGroup");

app.hideToolbarButton ("HowTo");
app.hideToolbarButton ("HowTo");

app.hideToolbarButton ("Navigation");

app.hideToolbarButton ("FirstPage");
app.hideToolbarButton ("PreviousPage");
app.hideToolbarButton ("NextPage");
app.hideToolbarButton ("LastPage");
app.hideToolbarButton ("endPageNavGroup");
app.hideToolbarButton ("GoBack");
app.hideToolbarButton ("GoForward");
app.hideToolbarButton ("endPageStackGroup");

app.hideToolbarButton ("Find");
app.hideToolbarButton ("FindEdit");
app.hideToolbarButton ("Editing");

app.hideToolbarButton ("Authoring");
app.hideToolbarButton ("Thread");
app.hideToolbarButton ("Crop");
app.hideToolbarButton ("Link");
app.hideToolbarButton ("3D");
app.hideToolbarButton ("Button");

app.hideToolbarButton ("Button");
app.hideToolbarButton ("CheckBox");
app.hideToolbarButton ("ComboBox");
app.hideToolbarButton ("ListBox");
app.hideToolbarButton ("RadioButton");
app.hideToolbarButton ("Tx");
app.hideToolbarButton ("Sig");
app.hideToolbarButton ("AddMovie");

app.hideToolbarButton ("AddMovie");
app.hideToolbarButton ("AddSound");
app.hideToolbarButton ("TouchUpTextTool");

app.hideToolbarButton ("TouchUpTextTool");
app.hideToolbarButton ("TouchUpLayoutTool");
app.hideToolbarButton ("TouchUpObjectTool");
app.hideToolbarButton ("endToolsGroup");

app.hideToolbarButton ("Measuring");

app.hideToolbarButton ("MeasureLine");
app.hideToolbarButton ("MeasurePolyline");
app.hideToolbarButton ("MeasurePolygon");
app.hideToolbarButton ("endMeasuringGroup");

app.hideToolbarButton ("PrintProduction");

app.hideToolbarButton ("TrapPresets");
app.hideToolbarButton ("OutputPreview");
app.hideToolbarButton ("PreflightTB");
app.hideToolbarButton ("ColorConversion");
app.hideToolbarButton ("InkManager");
app.hideToolbarButton ("AddMarks");
app.hideToolbarButton ("CropPages");
app.hideToolbarButton ("Hairlines");
app.hideToolbarButton ("Flattener");
app.hideToolbarButton ("Optimizer");
app.hideToolbarButton ("ProdDef");
app.hideToolbarButton ("endPrintProdGroup");

app.hideToolbarButton ("WebSearchView");
app.hideToolbarButton ("WebSearchView");
app.hideToolbarButton ("AdvCommenting");
app.hideToolbarButton ("Annots:Tool:FreeTextCallout");
app.hideToolbarButton ("Annots:Tool:PolygonCloud");
app.hideToolbarButton ("Annots:Tool:LineArrow");
app.hideToolbarButton ("Annots:Tool:LineArrow");
app.hideToolbarButton ("Annots:Tool:Square");
app.hideToolbarButton ("Annots:Tool:Circle");
app.hideToolbarButton ("Annots:Tool:Line");
app.hideToolbarButton ("Annots:Tool:PolyLine");
app.hideToolbarButton ("Annots:Tool:Polygon");
app.hideToolbarButton ("Annots:Tool:Ink");
app.hideToolbarButton ("Annots:Tool:EraseInk");
app.hideToolbarButton ("Annots:Tool:LineDimension");
app.hideToolbarButton ("Annots:Tool:FreeText");
app.hideToolbarButton ("Separator");

app.hideToolbarButton ("Commenting");
app.hideToolbarButton ("Annots:Tool:Text");
app.hideToolbarButton ("Annots:Tool:TextEdits");
app.hideToolbarButton ("Annots:Tool:Stamp");
app.hideToolbarButton ("Annots:Tool:Highlight");

app.hideToolbarButton ("Annots:Tool:Highlight");
app.hideToolbarButton ("Annots:Tool:Underline");
app.hideToolbarButton ("Annots:Tool:StrikeOut");
app.hideToolbarButton ("Annots:Tool:FileAttachmentReal");

app.hideToolbarButton ("Annots:Tool:FileAttachmentReal");
app.hideToolbarButton ("Annots:Tool:Sound");
app.hideToolbarButton ("Separator");
app.hideToolbarButton ("Annots:Tool:Filter");

var listener = { open: function (target) { app.alert ("Got here!"); } };
app.events.add (listener);


Dann sind zumindest die Buttons in den Menüleisten weg ;)
Damit die Buttons wieder kommen, die config.js entfernen und evtl. AcroRd32 Processe beenden.

Grüßle
16.09.2009
Scout 1,4k 2 8
Scout 1,4k 2 8
Danke erst mal für das nette Skript, allerdings klappt das Ausblenden schon ganz gut durch anhängen von "#navpanes=0&toolbar=0" an den Pfad zur PDF-Datei.

Dass die Behandlung des Rechtsklicks in diesem Falle nicht vom WebBrowser-Control kommt sondern vom intern geladenen Adobe Reader ist mir auch durchaus bewusst. Was ich suche ist einfach ein Weg, den Rechtsklick generell zu verhindern, bevor er überhaupt bei Adobe ankommt.
bbohac 16.09.2009
Das Problem bei deinem Ausblenden ist allerdings, dass die Funktion nicht verhindert wird, sondern nur die Ansicht sich ändert! Drücke einfach mal F8 und die Toolbars sind wieder da ;-)
Scout 16.09.2009
Ich hab dein JavaScript mal eben getestet: Hat bei mir (Adobe Reader 9) keinerlei Effekt.
bbohac 16.09.2009
Hmm hatte erst bedenken, dass das mit der 9 entfernt wurde, aber hab jetzt mal den Reader 9.1 installiert. Dort geht das wunderbar! Allerings mußte ich dran denken, die Datei "config.js" zu nennen. Evtl. zeigt auch der Arbeitsplatz die reale Dateiendung nicht an? (siehe Menü Extras > Ordneroptionen > Tab Ansicht > "Erweiterungen bei bekannten Dateitypen ausblenden" Haken entfernen) Die Datei ist dann vom Typ "JScript-Scriptdatei" (Bild: gelbe Scriptrolle) ...wenn ich dann im Browser ein PDF aufrufe erscheinen einige Symbole im Menü nicht mehr.
Scout 16.09.2009
Meine System-Settings stimmen so weit und die Datei heißt "config.js". Platziert hatte ich sie im Verzeichnis "C:\Programme\Adobe\Reader 9.0\Reader\Javascripts". Vorhin hat es nicht funktioniert, auch nicht auf dem System eines Kollegen mit Adobe Reader 8. Aber kaum weint man deswegen rum und versucht dann genau das selbige nochmal, geht es. Ganz groß :)

Gibt es innerhalb dieser "config.js" jetzt eventuell auch noch die Möglichkeit, Hauptmenü und Navigationsfenster komplett zu deaktiveren?
bbohac 16.09.2009
Die Möglichkeit ganze Toolbars auszublenden ist mir nicht bekannt. Das app-Objekt hat auch nur noch eine Methode um MenuItems auszublenden. (siehe http://www.verydoc.com/documents/acrojsguide/pg_0183.htm)
Scout 16.09.2009
Vielen Dank für den Link.
Ich muss sagen, die Lösung ist echt perfekt. Vielen Dank für den extrem hilfreichen Tipp.

Wie du schon gesagt hast, besteht bei "meiner" Lösung das Problem, dass man mit "F8" bzw. "F9" die ausgeschalteten Leisten wieder einzublenden. Kann bei "deiner" Lösung definitiv nicht mehr passieren, sehr gut!
bbohac 16.09.2009
0
Mal als Gundlegende Überlegung:
WIESO sollte einem Nutzer der Zugang ins Dateisystem verwehrt werden?
Er/Sie sitzt doch am eigenen Rechner?!

Ausserdem:
Sicher, dass IMMER der Adobe Reader genutzt wird? Oder ist das vom System abhängig?
Könnte es passieren, dass bei einem anderen Nutzer ein anderer PDF Reader (z.B. Foxit) geladen wird?
16.09.2009
DaSpors 4,2k 2 8
Die Umgebung für die eingesetzte Software ist die Produktion eines Pharma-Betriebs. Hier soll absolut kein Zugriff auf das Dateisystem erfolgen.
Und ja, der Adobe Reader wird IMMER eingesetzt, da er mit einem anderen Software-Paket mitgeliefert wird und definiert wurde, dass exakt dieser einzusetzen ist.
bbohac 16.09.2009
0
Ich habe jetzt heute eine Lösung entwickelt, die eventuell etwas übertrieben ist, aber immerhin funktioniert sie. Mehr wollte mein Chef nicht :)

Also, was habe ich getan?
Zunächst, vielen Dank dafür an Scout, schalte ich jetzt die Items der Menüleiste sowie der Toolbar via JavaScript aus. Dies hat den großen Vorteil, dass die Items (bzw. die ganzen Leisten) nicht via Shortcut wieder eingeschaltet werden können.

Leider ist auf diese Art eine Deaktivierung des Kontext-Menüs offenbar keine Möglichkeit vorgesehen. Daher habe ich zwei globale Maus-Hooks im System registriert, mit deren Hilfe ich den Mouse-Up und - Down für die rechte Maustaste abfange und diese einfach ignoriere, so dass sie niemals im Adobe Reader ankommen.

Problematisch könnte an dieser Stelle sein ,dass die beiden Events im kompletten System abgefangen werden und so nirgends mehr ankommen. In meinem Fall stört das aber nicht, da die Anwendung sowieso das komplette System "lahmlegen" soll.

Leider ist dieses radikale Vorgehen notwendig, weil der Adobe Reader innerhalb des WebBrowser-Controls offenbar in einem Thread ausgeführt wird. Jedenfalls hatte ich mit einem nicht-globalen Hook keinen Erfolg beim Empfangen der Maus-Events.

Immerhin habe ich auf diese Art auch gleich noch gelernt, wie ich einen KeyLogger implementieren kann. ;)
16.09.2009
bbohac 21 1 3
Radikal aber cool :)
DaSpors 17.09.2009
0
Hi,
ich nochmal ;-)
Was mich noch wundert ist, dass du den Umweg über den Webbrowser gehst. Wenn mal die Assoziation das PDFs im Browser angezeigt werden können verloren geht, dann öffnet sich auch kein PDF :-(

Aus diesem Grund würde ich den Adobe Reader direkt im System über seine CLSID ansprechen.
Wie das geht siehe http://dotnet-snippets.de/dns/adobe-reader-versionsunabhaengig-und-ohne-com-verweis-hosten-SID1225.aspx
Evtl. müsstest du ja dort nicht einen globalen Hook des Maus-Events nehmen.


Grüßle
17.09.2009
Scout 1,4k 2 8
An sich eine feine Idee.

Allerdings wird das System, in dem die Lösung eingespielt wird, vermutlich so schnell nicht wieder angefasst werden, falls überhaupt jemals. Daher schreckt mich die Möglichkeit, dass besagte Assoziation eventuell wegfallen könnte, nicht wirklich.

Zudem: aus einem Grund, der mir nicht klar ist, ist das WebBrowser-Control deutlich schneller mit fertig gerendertem PDF dargestellt als das Adobe Reader Control. Vermutlich wird da eine extra abgespeckte Reader-Version verwendet.
bbohac 17.09.2009
Ja in der Tat wird ein anderes Verfahren bei der Webanzeige verwendet. Ok, wollt es nur erwähnt haben. Grüßle
Scout 17.09.2009

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH