Pergunta word.Activate() "blinkt nur"

  • sexta-feira, 5 de novembro de 2010 12:51
     
      Contém Código

    Hallo Zusammen,

    ich hoffe ich bin hier im richtigen Forum gelandet.

    Ich verwende:

    • Windows 7
    • Office 2010
    Mein Problem ist folgendes:

     

    Ich versuche meine Word-Application (nachdem ich ein paar Textmarken gefüllt habe) mit

    word.Activate()

    in den Vordergrund zu holen. Das klappt auch, allerdings nur solange ich mein Projekt im Debug-Modus ausführe. Sobald ich es ohne Debugging starte, blinkt das Word-Taskleistensymbol nur.

    Jetzt habe ich gelesen, dass ab Windows Vista verhindert wird, dass der Fokus einfach "geklaut" wird.

    Jetzt könnte ich natürlich AppActivate() verwenden, jedoch ist mir das zu unsicher. Denn hier kann ich ja nicht 100%ig sichergehen, wie der Titel lautet. word.Caption liefert mir ja nur "Microsoft Word" zurück. Der Titel des Fensters besteht allerdings noch aus dem Dateinamen und evtl. [Kompatiblitätsmodus]

    Also z. B.: Test.doc [Kompatibilitätsmodus] - Microsoft Word

    Lange Rede, kurzer sinn: Gibt es eine zuverlässige Möglichkeit unter Windows 7 und Word 2010 das Word-Fenster in den Vordergrund zu holen?

     

    Edit: Heute ist mir aufgefallen, dass auch das Outlook-Adressfenster das ich per Application.GetAddress() aufrufe, nicht in den Vordergund kommt (im Debugmodus allerdings schon)


    Gruß Florian

Todas as Respostas

  • segunda-feira, 15 de novembro de 2010 11:10
     
     

    Hallo,

    ich hatte ein ähnliches Problem. Ich habe in meiner Funktion das Fenster selber minimiert, dann meine Aufgaben erledigt und am Ende der Funktion das Dokument (nicht die Anwendung) wieder nach oben geholt. Solange das in einer Function oder Sub passiert geht es. Wenn ich versuche den Fokus in einer anderen Sub zu holen geht es MANCHMAL auch nicht. Aber ich habe dass System noch nicht entdeckt :-)

    Grüße

    Carsten

  • terça-feira, 16 de novembro de 2010 10:25
     
     

    Hallo Carsten,

    erstmal vielen Dank für deine Antwort (Ich dachte schon es kommt gar keine mehr)

     

    Ich habe es mit word.Application.WindowState versucht, und auch mit doc.Activate() . Aber sobald ich mein AddIn nicht mehr im Debug-Modus ausführe, bekomme ich Word nicht in den Vordergrund.

    Ich öffne ja für mein neues Dokument in einem neuen Word-Fenster. Kann ich dann evtl. das "alte" Fentster irgendwie schließen (sodass das neue dann nicht mehr vom alten verdeckt wird?)


    Gruß Florian
  • domingo, 6 de fevereiro de 2011 23:04
     
     

    Hallo,

     

    generell werden solche Anwendungen nur mit word.Visible = True in den Vorderung geholt.

    Daher wäre der Rest deines Codes interessant.


    Cheers, Jörn Bosse
    Microsoft Studentpartner
  • quarta-feira, 9 de fevereiro de 2011 14:22
     
     

    Das blinken in der Taskleiste zeigt nur, dass dein Fenster aktiv ist, welches aber nicht im Vordergrund steht. 

    Ich würde ggf. auf WinAPI zurückgreifen. 

    setForgroundWindow(handle) holt ein Fenster nach vorne und dann das Fenster noch wie du es bereits gemacht hast, aktivieren.

    http://msdn.microsoft.com/en-us/library/ms633539(v=vs.85).aspx

    Mit der WinAPI ShowWinow, kannst du zudem noch das den Fensterstatus von minimiert auf Normal oder maximiert ändern. 

    Leider habe ich für die Windows API's gerade nicht die VBA deklaration zur Hand, aber in Google dürftest du die finden.

  • quarta-feira, 9 de fevereiro de 2011 14:26
     
     
    Ich würde alternativ versuchen das Dokument mit Visible=False zu verbergen und mit Visible = True wieder sichtbar zu machen.

    Cheers, Jörn Bosse
    Microsoft Studentpartner
  • segunda-feira, 14 de maio de 2012 18:33
     
      Contém Código

    hallo allerseits,

    mein beitrag kommt zwar um einiges verspätet, aber vielleicht ist er noch anderen besuchern dieses threads mit dem selben problem nützlich.

    das fenster war offensichtlich aktiviert, aber nicht im vordergrund.

    zunächst die benötigten winAPI

        <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
        Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
        End Function
        <DllImport("user32.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
        Public Shared Function SetForegroundWindow(ByVal hwnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
        End Function
    

    und hier die befehlszeilen, um das fenster damit in den vordergrund zu rücken

            Dim fenstertitel As String = word.ActiveWindow.Caption & " - " & word.Caption
            Dim fensterHandle As IntPtr = FindWindow("OpusApp", fenstertitel)
            SetForegroundWindow(fensterHandle)

    grüsse, peter