Writer ohne Dokument starten

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Hurby
**
Beiträge: 46
Registriert: Di, 30.08.2005 10:40

Writer ohne Dokument starten

Beitrag von Hurby »

Hallo,

weiss Jemand wie ich mit VB6 den Writer ohne Dokument starte?

Bei:

Code: Alles auswählen

Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
Set objStardesktop = objServiceManager.createinstance("com.sun.star.frame.Desktop")
Set objDoc = objStardesktop.loadComponentfromurl("private:factory/swriter", "_blank", 0, dummy)
habe ich ja ein leeres, ich möchte aber nur die Awendung ohne Dokument.

Würde mich sehr freuen, wenn Jemand Rat weiss

MfG Hurby
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

weiss Jemand wie ich mit VB6 den Writer ohne Dokument starte?


das geht nicht, die Art des geladenen Dokuments bestimmt, das Modul, es gibt i.d.S. keinen "Writer" (Swriter.exe ist nur eine Art Launcher der notwendige Komponenten lädt)

Das was Du meinst ist wahrscheinlich der StarDesktop der übrig bleibt wenn Du das letzte Dokument manuell schließt. Die Betonung liegt hier auf manell, ich kenne keine Methode das letzte Dokument unter Erhalt des sichtbaren StarDesktops zu schließen oder einen sichtbaren StarDesktop zu erzeugen - und Zugriff auf das Objekt des Stardesktops besteht doch mit Deinem Code bereits uneingeschränkt.

Wozu soll das Ganze dienen?
Selbst wenn es eine Möglichkeit gäbe, was willst Du dann tun, es gibt dort nichts Wesentliches worauf ein Benutzer aus der Oberfläche heraus Zugriff hat. Alles was manuell erreichbar wäre ist aber auch per Code ereichbar, z.B.

Code: Alles auswählen

Set dispatcher = objServiceManager.createinstance("com.sun.star.frame.DispatchHelper")
'DateiÖffnen Dialog
Set x = dispatcher.executeDispatch(objStardesktop, ".uno:Open", "", 0, mNoArgs())
'Neues Dokument aus Vorlage (Dialog)
'Set x = dispatcher.executeDispatch(objStardesktop, ".uno:NewDoc", "", 0, mNoArgs())
'Optionen-Dialog
'Set x = dispatcher.executeDispatch(objStardesktop, ".uno:OptionsTreeDialog", "", 0, mNoArgs())
'Makro ausführen
'Set x = dispatcher.executeDispatch(objStardesktop, sMacroURL, "", 0, mNoArgs())
'usw. ...

Gruß
Stephan
Hurby
**
Beiträge: 46
Registriert: Di, 30.08.2005 10:40

Beitrag von Hurby »

Es handelt sich um ein Automatisierungsprogramm. Zum drucken von Serienbriefen. Ich wollte eigentlich OpenOffice Writer starten, aber ohne das man es in der Taskleiste sieht, und mit dem hwnd den Process überwachen. Der Funktion mit der ich den handle auslese braucht nur die Überschrift des Containers. Bei Word wäre das "Microsoft Word" egal ob davor "Dokument1" oder sonstwas steht. Bei OpenOffice muss ich aber den Dateinamen mit angeben also "Unbenannt1 - OpenOffice.org Writer". Das ist schlecht, weil ja auch Parallelsitzungen offen sein können, die mit meinem Programm nichts zu tun haben, sodass ich evtl. den falschen handle erwischen könnte. Also dachte ich mir brauche ich vorerst nur die Containeranwendung. Am besten ohne das man es in der Taskleiste sieht.

Wenn du mir sagen könntest wie ich es schaffe, das man die Anwendung nicht in der Taskleiste sieht hättest Du mir auch schon geholfen...

MfG Hurby
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Ich verstehe Deine Überlegungen nicht. Wozu brauchst Du:
Der Funktion mit der ich den handle auslese braucht nur die Überschrift des Containers.
Du hast doch sofort direkten ZUgriff über die Objektvariable die Du dem erstellten Objekt zuweist und mußt es nicht unter einer Anzahl anderer Objekte (geöffneter Dokumente) identifizieren.
Bei OpenOffice muss ich aber den Dateinamen mit angeben also "Unbenannt1 - OpenOffice.org Writer". Das ist schlecht, weil ja auch Parallelsitzungen offen sein können, die mit meinem Programm nichts zu tun haben, sodass ich evtl. den falschen handle erwischen könnte.
Das stimmt, nur ist mir dann Dein Vorgehen gänzlich unklar, wenn Du nicht weißt ob oder was sonst noch vorhanden sein kann woher weißt Du dann das dort "Unbenannt1" steht und nicht "Unbenannt2" oder Anderes. So kannst Du das gewünschte Dokument doch ohnehin nicht identifizieren.

Aber wie gesagt, da ist nichts zu identifizieren, Du kennst es weil Du es ja erzeugst, es ist objDoc.

So erzeugst Du das Objekt mit:

Code: Alles auswählen

Set objDoc = objStardesktop.loadComponentfromurl("private:factory/swriter", "_blank", 0, dummy)
nachsehen unter der IDL, zeigt Dir (wie gestern bereits erwähnt) für die Methode .loadComponent fromURL alles Notwendige, hier die notwendigen Parameter für das Parameter-array "dummy".


Wenn es nicht sichtbar sein soll verwende einfach den Hidden-Parameter wie in der IDL-Referenz angegeben, also z.B.:

Code: Alles auswählen

Set objServiceManager = CreateObject("com.sun.star.ServiceManager") 
Set objStardesktop = objServiceManager.createinstance("com.sun.star.frame.Desktop") 
Dim dummy(0)
Set dummy(0) = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
dummy(0).Name = "Hidden"
dummy(0).Value = True
Set objDoc = objStardesktop.loadComponentfromurl("private:factory/swriter", "_blank", 0, dummy)


Gruß
Stephan
Hurby
**
Beiträge: 46
Registriert: Di, 30.08.2005 10:40

Beitrag von Hurby »

Vielleicht habe ich es nur sch...lecht ausgedrückt. Wo finde ich eigentlich die IDL-Referenz? Ich habe mir zwar das SDK runtergeladen und installiert, aber hab keine Ahnung wie man es verwendet. Kannst du mir etwas helfen?

MfG Hurby
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Wo finde ich eigentlich die IDL-Referenz?
das SDK hat eine Startseite (index.html), dort steht unter der Überschrift "Contents" ein Eintrag "IDL-Referenz", klickst Du dort drauf erscheint die IDL-Referenz.

online auch:
http://api.openoffice.org/docs/common/r ... le-ix.html

oder, ich würde es nicht glauben wenn ich es nicht probiert hätte, aber tatsächlich liefert Google mit "IDL-Referenz +openoffice" als ersten Treffer den Link zur IDL-Referenz: :wink:
http://www.google.de/search?num=20&hl=d ... uche&meta=

und zur Sicherheit, noch Nachtrag:

Wenn ich sagte Du mußt nichts identifizieren, weil Du das Objekt erzeugtst - wenn Du obenstehenden Code ausführst kannst Du danach ganz normal auf das Objekt zugreifen, als Beispiel trage ich hier etwas Text ein und speichere das Dokument:

Code: Alles auswählen

Set objServiceManager = CreateObject("com.sun.star.ServiceManager") 
Set objStardesktop = objServiceManager.createinstance("com.sun.star.frame.Desktop") 
Dim dummy(0) 
Set dummy(0) = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue") 
dummy(0).Name = "Hidden" 
dummy(0).Value = True 
Set objDoc = objStardesktop.loadComponentfromurl("private:factory/swriter", "_blank", 0, dummy)

Dim mNoArgs()
Set Cursor = objDoc.Text.CreateTextCursor
Call Cursor.SetString("nur ein Test")
Call objDoc.storeToURL("file:///c:/jms.odt", mNoArgs())

Gruß
Stephan
Hurby
**
Beiträge: 46
Registriert: Di, 30.08.2005 10:40

Beitrag von Hurby »

Hallo,
Du kennst es weil Du es ja erzeugst
mit dem Handle wollte ich eigentlich im Quellcode "mitbekommen", wann der User das Dokument schliesst, oder falls die Anwendung abschmiert. Der Handle würde dann ja nicht mehr existieren und ich könnt im Code reagieren. Wie würdest du das Programmieren? Oder besteht die möglichkeit über meine Objekte Events abzufangen?

MfG Hurby
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

mit dem Handle wollte ich eigentlich im Quellcode "mitbekommen", wann der User das Dokument schliesst,


der User kann das Dokument nicht schließen, wenn es nicht sichtbar geöffnet ist
oder falls die Anwendung abschmiert.
Deine Aussage ist diese:
Bei Word wäre das "Microsoft Word" egal ob davor "Dokument1" oder sonstwas steht.
auch nur wenn ich es sichtbar starte. Für ein sichtbar gestartetes Word weiß ich natürlich wie ich an den Fenstertitel komme, nur wie soll das bei einem unsichtbaren gehen? Unsichtbar hieße hier beispielsweise:

Code: Alles auswählen

'VB-Script
set wshshell = CreateObject("WScript.Shell")
wshshell.run "winword.exe",0
Und nun willst Du das ja für OOo ausdrücklich so das Du es unsichtbar startest und da habe ich keine Ahnung wie Du den Fenstertitel idendifizieren willst.
Wenn Du einen Weg wüßtest ginge der hingegen auch für OOo.
Wie würdest du das Programmieren?
Ich würde die Fehler abfangen die in Folge auftreten wenn das Programm (OOo) abstürzt, denn natürlich tritt dann ein Fehler auf wenn Du versuchst beispielsweise das zu tun:

Code: Alles auswählen

Call Cursor.SetString("nur ein Test")
Ich meine was sollte ich denn anders machen, wenn ich wie auch immer einen Event bekomme 'OOo ist gerade abgestürzt' statt der Feststellung 'das Dokumenten-Objekt existiert nicht mehr'?
In beiden Fällen wäre OOo neu zu starten, oder was übersehe ich.
Oder besteht die möglichkeit über meine Objekte Events abzufangen?
Weiß ich leider nicht wie. Außerdem bliebe das unsicher insofern als zwar OOo die Dokumentwiederherstellung automatisch startet wenn es abstürzt, aber das passiert nicht immer, wenn OOo abstürzt zwar sicher in 99% der Fälle, nur wenn OOo blockiert doch garnicht. Im Prinzip sollte man das also detektieren können, nur ich bleibe dabei:
ich sehe keinen praktischen Nutzen weil für Dich nur interessant ist das Du Zugriff hast und wenn Du den nicht mehr hast kriegst Du einen Fehler den Du abfangen kannst, hingegen zu versuchen das Ereignis das die Dokumentwiederherstellung auslöst zu detektieren bleibt unsicher, da es zwar fast immer, aber nicht immer eintritt.


Gruß
Stephan
Hurby
**
Beiträge: 46
Registriert: Di, 30.08.2005 10:40

Beitrag von Hurby »

Wenn Du einen Weg wüßtest ginge der hingegen auch für OOo.
eben nicht, wenn du Word hast und VB6 dann teste mal dies aus:

Code: Alles auswählen

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" ( _
    ByVal hwnd As Long, _
    ByVal lpString As String, _
    ByVal cch As Long) As Long
Private Declare Function GetWindow Lib "user32" ( _
    ByVal hwnd As Long, _
    ByVal wCmd As Long) As Long
Private Declare Function GetParent Lib "user32" ( _
    ByVal hwnd As Long) As Long

Private Const GW_HWNDNEXT = 2

Private objWord As Object

Private Function ApplHandle(ByVal Caption As String) As Long
Dim vClass As Variant
  'VB-Applikationen/Klassen bevorzugen:
  For Each vClass In Array( _
      "ThunderRT5MDIForm", "ThunderRT6MDIForm", _
      "ThunderRT5Form", "ThunderRT6Form", _
      vbNullString)
    'Applikation/Klasse checken:
    ApplHandle = GetHandle(vClass, Caption)
    If ApplHandle Then Exit Function
  Next vClass
End Function

Private Function GetHandle( _
    ByVal Class As String, ByVal Caption As String _
  ) As Long
  Dim Buffer As String
  Dim Length As Long
  'Auf exakten Treffer checken:
  GetHandle = FindWindow(Class, Caption)
  If GetHandle Then Exit Function
  'Alle Klassen-Windows durchlaufen:
  Caption = UCase$(Trim$(Caption))
  GetHandle = FindWindow(Class, vbNullString)
  Do While GetHandle
    'Nur Top-Windows berücksichtigen:
    If GetParent(GetHandle) = 0 Then
      'Caption holen:
      Buffer = Space$(255)
      Length = GetWindowText(GetHandle, Buffer, 255)
      Buffer = UCase$(Left$(Buffer, Length))
      'Exakter Vergleich:
      If Buffer = Caption Then Exit Do
      'MDI-Form berücksichtigen:
      If Buffer Like Caption & " - *" Or Buffer Like "* - " & Caption Then
        Exit Do
      End If
    End If
    GetHandle = GetWindow(GetHandle, GW_HWNDNEXT)
  Loop
End Function

Private Sub Form_Load()
Set objWord = CreateObject("word.application")
'objWord.Visible = True
MsgBox ApplHandle("Microsoft Word")
objWord.quit
Set objWord = Nothing
End
End Sub
du kannst nach belieben Word anzeigen oder nicht...

Code: Alles auswählen

'objWord.Visible = True
und bekommst immer den Handle...

Und das versuche ich mit OOo

MfG Hurby
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

wenn du Word hast und VB6 dann teste mal dies aus:
ja, ich sehe ...

dann gibt es ein Problem, es geht meines Wissens überhaupt nicht mittels des Parameters Hidden ein Dokument zu laden und es nachträglich sichtbar zu machen.

Was geht ist das Dokument zu laden und sofort wieder zu verstecken:

Code: Alles auswählen

Set objServiceManager = CreateObject("com.sun.star.ServiceManager") 
Set objStardesktop = objServiceManager.createinstance("com.sun.star.frame.Desktop") 
Set objDoc = objStardesktop.loadComponentfromurl("private:factory/swriter", "_blank", 0, dummy)
objDoc.currentcontroller.Frame.containerwindow.Visible = False
der Vorteil ist das Du dann einen Parameter mitgeben kannst (soweit ich getestet habe aber nicht mit Hidden kombiniert, unter Fortlassung .Visible):

Code: Alles auswählen

'...
Dim dummy(0)
Set dummy(0) = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
dummy(0).Name = "DocumentTitle"
dummy(0).Value = "ddd"
Set objDoc = objStardesktop.loadComponentfromurl("private:factory/swriter", "_blank", 0, dummy)
objDoc.currentcontroller.Frame.containerwindow.Visible = False
und dadurch den Fenstertitel kennst, hier also:

"ddd - OpenOffice.org 2.0.2 Writer"


Optimal ist das rein optisch nicht, da das Programmfenster kurz zu sehen ist.

Bessere Möglichkeit habe ich derzeitig nicht für Dich.


Bloß was nutzt Dir die Ermittlung der ID des Prozesses praktisch? Wenn der Prozess abstürzt was willst Du dann Anderes tun als das Dokument neu zu laden?
Und die dazu notwendige Info kriegst Du doch jederzeit wenn ein Zugriff auf das Dokumentobjekt zu einem Fehler führt, auf den Du reagieren kannst, Sowas hier:

Code: Alles auswählen

Sub Makro1()
Dim mNoArgs()
   Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
Set objStardesktop = objServiceManager.createinstance("com.sun.star.frame.Desktop")

Dim dummy(0)
Set dummy(0) = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
dummy(0).Name = "Hidden"
dummy(0).Value = True
Set objDoc = objStardesktop.loadComponentfromurl("private:factory/swriter", "_blank", 0, dummy)
'schliessen
Call objDoc.Close(True)
'Zugriff auf das Dokumentobjekt führt zu einem Fehler, weil es nicht mehr vorhanden ist
Set Cursor = objDoc.Text.CreateTextCursor

Exit Sub
xxx:
MsgBox "xxx"

End Sub


Gruß
Stephan
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

und dadurch den Fenstertitel kennst, hier also:

"ddd - OpenOffice.org 2.0.2 Writer"

mmh, das war nicht optimal, weil versionsabhängig. Ich war wohl etwas durch das testen der Parameterkombination (Hidden/DocumentTitle) verwirrt - das hier ist besser und sollte wohl laufen:

Code: Alles auswählen

Dim mNoArgs()
Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
Set objStardesktop = objServiceManager.createinstance("com.sun.star.frame.Desktop")
Dim dummy(0)
Set dummy(0) = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
dummy(0).Name = "Hidden"
dummy(0).Value = True
Set objDoc = objStardesktop.loadComponentfromurl("private:factory/swriter", "_blank", 0, dummy)
MsgBox objDoc.currentcontroller.Frame.Title

ich schreibe wohl, weil es hier nur mit aktiviertem Schnellstarter geht, weil sich sonst SO7 und OOo 2.0.2 in die Quere kommen. Ich bin zu faul jetzt SO zu deinstallieren.
Falls es wieder Erwarten doch Probleme gibt würde ich einfach ganz zu Anfang den Schnellstarter ebenfalls mit VB starten und bei Notwendigkeit das VB 2-3 Sekunden pausieren lassen bis der Schnellstarter fertig ist.

Allerdings ist mir noch etwas aufgefallen, obenstehender Code erzeugt immer den gleichen Titel, der bei mir nur Unbenannt - ... ist (und nicht Unbenannt1 ... oder 2 oder ...), zunächst keine Ahnung warum. Das gibt aber ein Problem, weil Du ja gerade Programmfehlfunktionen ausschließen willst. Deine Prüfung ist dann dafür nicht einbdeutig genug, denn scheitert das schließen eines Dokuments mit z.B.:

Code: Alles auswählen

Call objDoc.Close(True)
hast Du bei der Neuerzeugung plötzlich zwei Fenster gleichen Titels und unterschiedlicher Prozess-ID. Ist aber bei Word auch so, wie ich feststelle. Mir scheint Du mußt also vor dem Schließen den Titel speichern und danach gleich nochmal darauf kontrollieren ob der Prozess auch wirklich beendet wurde.



Gruß
Stephan
Hurby
**
Beiträge: 46
Registriert: Di, 30.08.2005 10:40

Beitrag von Hurby »

Hallo Stephan,
es geht meines Wissens überhaupt nicht mittels des Parameters Hidden ein Dokument zu laden und es nachträglich sichtbar zu machen.
warum nicht? Funktioniert doch...

Code: Alles auswählen

Option Explicit

Dim objServiceManager As Object
Dim objStardesktop As Object
Dim objDoc As Object

Private Sub Form_Load()

Dim arg(0) As Object
Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
Set objStardesktop = objServiceManager.createinstance("com.sun.star.frame.Desktop")
Set arg(0) = MakePropertyValue("Hidden", True)
Set objDoc = objStardesktop.loadComponentfromurl("private:factory/swriter", "_blank", 0, arg)
Msgbox "nicht sichtbar"
objDoc.currentcontroller.Frame.containerwindow.Visible = True
Msgbox "sichtbar"
End
End Sub

Private Function MakePropertyValue(Name, Value) As Object

Dim Struct As Object

Set Struct = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Struct.Name = Name
Struct.Value = Value
Set MakePropertyValue = Struct
End Function
und dadurch den Fenstertitel kennst
deluxe, danke...
Allerdings ist mir noch etwas aufgefallen, obenstehender Code erzeugt immer den gleichen Titel
Mir scheint Du mußt also vor dem Schließen den Titel speichern und danach gleich nochmal darauf kontrollieren ob der Prozess auch wirklich beendet wurde
nö nö, das macht nichts:

für Word kann ich den Code wie folgt modifizieren:

Code: Alles auswählen

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" ( _
    ByVal hwnd As Long, _
    ByVal lpString As String, _
    ByVal cch As Long) As Long
Private Declare Function GetWindow Lib "user32" ( _
    ByVal hwnd As Long, _
    ByVal wCmd As Long) As Long
Private Declare Function GetParent Lib "user32" ( _
    ByVal hwnd As Long) As Long
Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" ( _
    ByVal hwnd As Long, _
    ByVal wFlag As Long) As Long

Private Const GW_HWNDNEXT = 2

Private objWord As Object
Private objDoc As Object

Private Function ApplHandle(ByVal Caption As String) As Long
Dim vClass As Variant
  'VB-Applikationen/Klassen bevorzugen:
  For Each vClass In Array( _
      "ThunderRT5MDIForm", "ThunderRT6MDIForm", _
      "ThunderRT5Form", "ThunderRT6Form", _
      vbNullString)
    'Applikation/Klasse checken:
    ApplHandle = GetHandle(vClass, Caption)
    If ApplHandle Then Exit Function
  Next vClass
End Function

Private Function GetHandle( _
    ByVal Class As String, ByVal Caption As String _
  ) As Long
  Dim Buffer As String
  Dim Length As Long
  'Auf exakten Treffer checken:
  GetHandle = FindWindow(Class, Caption)
  If GetHandle Then Exit Function
  'Alle Klassen-Windows durchlaufen:
  Caption = UCase$(Trim$(Caption))
  GetHandle = FindWindow(Class, vbNullString)
  Do While GetHandle
    'Nur Top-Windows berücksichtigen:
    If GetParent(GetHandle) = 0 Then
      'Caption holen:
      Buffer = Space$(255)
      Length = GetWindowText(GetHandle, Buffer, 255)
      Buffer = UCase$(Left$(Buffer, Length))
      'Exakter Vergleich:
      If Buffer = Caption Then Exit Do
      'MDI-Form berücksichtigen:
      If Buffer Like Caption & " - *" Or Buffer Like "* - " & Caption Then
        Exit Do
      End If
    End If
    GetHandle = GetWindow(GetHandle, GW_HWNDNEXT)
  Loop
End Function

Private Function FindChildByTitle(ByVal parent&, ByVal Title$) As Long
'...ByTitle:
Dim temp$, title_$, child&, child_&
    temp$ = String(255, 0)
    FindChildByTitle = 0
    child& = GetWindow(parent&, 5)
    Do
        DoEvents
        title_$ = Left$(temp$, GetWindowText(child&, temp$, 255))
        If title_$ <> "" And (LCase(Title$ & "*") Like LCase(title_$ & "*") Or LCase("*" & Title$) Like LCase("*" & title_$) Or LCase(Title$ & " (Schreibgeschützt)" & "*") Like LCase(title_$ & "*")) Then
            FindChildByTitle = child&
            Exit Function
        End If
        If GetWindow(child&, 5) <> 0 Then
            child_& = FindChildByTitle(child&, Title$)
            If child_& <> 0 Then
                FindChildByTitle = child_&
                Exit Function
            End If
        End If
        child& = GetNextWindow(child&, 2)
    Loop Until child& = 0
    FindChildByTitle = 0
End Function

Private Sub Form_Load()
Set objWord = CreateObject("word.application")
Set objDoc = objWord.Documents.Add
'objWord.Visible = True
MsgBox FindChildByTitle(ApplHandle("Microsoft Word"), objDoc.Name)
objWord.quit
Set objWord = Nothing
End
End Sub
man übergibt die ID vom Parent und sucht darin die ID von einem bestimmten Child mit einem bestimmten Titel.

Habe es noch nicht für OO getestet, sollte aber auch funktionieren. Wenn du willst kann ich dich ja über eventuelle Erfolge informieren...

MfG Hurby
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

warum nicht?
Weil ich nicht garantieren kann das es funktioniert (wir hatten hier nirgens, oder ich habe es übersehen, über eine bestimmte OOo-Version gesprochen, ich setze dann voraus das die Frage versionsunabhängig gilt).
In OOo 1.1.4 (bzw. 1.x allgemein) funktioniert es beispielsweise definitiv nicht - habs gerade nochmal getestet. Und ich möchte auch nicht pauschal behaupten das es in allen 2.x-Versionen geht.

Wenn du willst kann ich dich ja über eventuelle Erfolge informieren...
ja, sehr gerne. Ich kann zwar VB, aber habe seit 2 Jahren kaum noch was damit gemacht (gestern hatte ich nun mal wieder Gelegenheit). Insbesondere ist hier auch jeder an Infos zur OOo-Programmierung in Amderem als StarBasic interessiert, denn darüber gibt es wirklich nicht viele Informationen.
Es ist dann nämlich auch immer die Frage ob alles so geht wie es gehen sollte und das zeigt sich nur in der Praxis und hinsichtlich wirklicher Praxis in OOo-Programmierung beschränkt sich diese bei mir leider auf StarBasic und ein bißchen Zugriff mittels VBA und VB-Script.



Gruß
Stephan
Hurby
**
Beiträge: 46
Registriert: Di, 30.08.2005 10:40

Beitrag von Hurby »

Ok Stephan,

dann bleibt mir vorerst nur noch eine Frage:

Kannst du mir verraten wie ich durch Code die Version von OO raus bekomme, damit ich entsprechend reagieren kann?

MfG Hurby
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

da das ganz universell funktionieren müßte fällt mir dazu nichts ein, ggf. hilft Dir:
http://de.openoffice.org/servlets/Brows ... rom=932948

bereits weiter.



Gruß
Stephan
Antworten