ActiveX / OLE in SWT: MS-Word Symbolleiste / Toolbar ausblenden

Status
Nicht offen für weitere Antworten.

JDad

Mitglied
Hallo!

Ich habe MS-Word in meine SWT-Applikation eingebunden, was soweit funktioniert.

Was ich nun machen will, ist den Funktionsumfang von Word auf ein bestimmtes Minimum gegrenzen, indem ich bestimmte Symbolleisten ausblende bzw. deaktiviere und diese somit vor dem Benutzer verberge. Es soll z. B. unter anderem die Symbolleiste "Zeichnen" nicht erscheinen.

Ist es mittels ActiveX / OLE oder sonst irgendwie möglich?

Vielen Dank im Voraus!

Gruß
JDad
 
Hallo noch mal!

Mein Code sieht wie folgt aus:

Code:
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleControlSite;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class WordOLE
{
    public static void main(String[] args)
    {
        final Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        OleControlSite controlSite;
        try
        {
            OleFrame frame = new OleFrame(shell, SWT.NONE);
            controlSite = new OleControlSite(frame, SWT.NONE, "Word.Document");
            controlSite.doVerb(OLE.OLEIVERB_SHOW);//.OLEIVERB_INPLACEACTIVATE);
        }
        catch (SWTError e)
        {
            System.out.println("Unable to open activeX control");
            return;
        }
        shell.open();

        // IWebBrowser
        final OleAutomation msWord = new OleAutomation(controlSite);

        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
                display.sleep();
        }
        // Remember to release OleAutomation Object
        msWord.dispose();
        display.dispose();
    }
}


Der angehängte Screenshot zeigt das Resultat. Dort sieht man auch unten die Zeichnen-Symbolleiste.

Weiss jemand eine Lösung?
 

Anhänge

  • OleWord.jpg
    OleWord.jpg
    15,3 KB · Aufrufe: 307
Was ich neulich gemacht habe um Access per Oleautomation zu steuern ist in einer for-Schleife von 0 bis 20000 getName von (in deinem Fall) msWord aufzurufen. Immer wo nicht null zurückgeliefert wird hast du eine Funktion entdeckt. Dann schnappst du dir nen paar von den Funktionsnamen die gut klingen und gibst die in google ein. Wenn du Glück hast gelangst du so zur Doku von Microsoft die alles beschreibt. So müsstest du auch rausfinden können wie sich die Leisten ausblenden lassen.
 
Danke für deine Antwort, Zeja!

Meinst du die Type Library? Dort sind meines Wissens nach die Funktionen aufgelistet.

Fallst du öfter mit ActiveX / OLE zu tun hast, empfehle ich Dir den Tool "OLE / COM Object Viewer". Dort sind Bäume mit diversen Einzelheiten zu vorhandenen OLE-Objekten u. a. die Type Library.

Ich hatte gehofft, dass es irgendwie einfacher geht über irgendwelche Java-Methoden sowas wie getTollbar("toolbarName").setEnabled(false) oder so... Naja... wie es scheint muss rumgefummelt werden. :-(

Wenn jemand doch eine einfachere Alternative weiß, wäre ich sehr dankbar für einen Tipp!

Gruß
JDad
 
Hallo,

... mal schnell zusammen gehacked:
Java:
/**
 * 
 */
package de.tutorials;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleClientSite;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.ole.win32.Variant;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * @author Thomas.Darimont
 */
public class SWTOleWordWithoutMenuExample {

  public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);

    shell.setText("SWTOleWordWithoutMenuExample");

    shell.setSize(640, 480);

    shell.setLayout(new FillLayout());

    OleFrame frm = new OleFrame(shell, SWT.NONE);

    OleClientSite site = new OleClientSite(frm, SWT.NONE, "Word.Document");

    shell.open();

    OleAutomation oleAutomation = new OleAutomation(site);
    int commandBarsDispId = oleAutomation.getIDsOfNames(new String[] { "CommandBars" })[0];

    Variant commandBars = oleAutomation.getProperty(commandBarsDispId);
    System.out.println(commandBars);

    OleAutomation commandBarsAutomation = commandBars.getAutomation();
    int commandBarsCountDispId = commandBarsAutomation.getIDsOfNames(new String[] { "Count" })[0];

    int commandBarsCount = commandBarsAutomation.getProperty(commandBarsCountDispId).getInt();

    for (int i = 0; i < commandBarsCount; i++) {
      Variant commandBar = oleAutomation.getProperty(commandBarsDispId, new Variant[] { new Variant(i) });
      if (null != commandBar) {
        OleAutomation commandBarAutomation = commandBar.getAutomation();
        int visibleDispId = commandBarAutomation.getIDsOfNames(new String[] { "Visible" })[0];

        commandBarAutomation.setProperty(visibleDispId, new Variant(false));

        commandBarAutomation.dispose();
      }
    }

    commandBarsAutomation.dispose();

    while (!shell.isDisposed())
      if (!display.readAndDispatch()) display.sleep();

    site.deactivateInPlaceClient();
    oleAutomation.dispose();
    site.dispose();
  }

}

Gruß Tom
 

Anhänge

  • swtOleWordWithoutMenusExample.jpg
    swtOleWordWithoutMenusExample.jpg
    25,1 KB · Aufrufe: 208
Danke Thomas, es ist genau das, was ich brauche.

Ist es möglich, die Symbolleisten gar nicht erst einblenden zu lassen? Beim Starten des Programms werden diese nämlich kurzzeitig angezeigt bevor sie ausgeblendet werden.

Gruß
 
Status
Nicht offen für weitere Antworten.
Zurück