Word in Vordergrund holen [ERLEDIGT]

Einbindung von Office-Komponenten wie Word, Excel usw.

Moderator: Moderatoren

Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Word in Vordergrund holen [ERLEDIGT]

Beitrag von Koverhage »

In unsere Anwendung wird Word / Excel benutzt.
Leider wird Word / Excel dabei in die Taskleiste gelegt und das Programm ist im Hintergrund.
Wie kann ich Word / Excel automatisch / programmgesteuert in den Vorgrund bringen ?
-
Es gibt sogar Kunden die rufen an, dass das Programm hängt :(
2019-03-27_130024.jpg
2019-03-27_130024.jpg (4.94 KiB) 15089 mal betrachtet
Zuletzt geändert von Koverhage am Mo, 01. Apr 2019 10:03, insgesamt 1-mal geändert.
Gruß
Klaus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Word in Vordergrund holen

Beitrag von AUGE_OHR »

gruss by OHR
Jimmy
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Word in Vordergrund holen

Beitrag von Koverhage »

Das ist mit zu hoch und zu aufwendig.
Gruß
Klaus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Word in Vordergrund holen

Beitrag von AUGE_OHR »

gruss by OHR
Jimmy
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Word in Vordergrund holen

Beitrag von Koverhage »

Ich hatte eher gehofft das es etwas wie oWord:BringWindowToTop gibt.
Gruß
Klaus
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Word in Vordergrund holen

Beitrag von Herbert »

wenn schon wäre es ein activate(). Das gibt es im API.
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Word in Vordergrund holen

Beitrag von Koverhage »

Hatte ich schon, da blinkt es bloß. Gabe das hier gefunden. bekomme aber die richtige Syntax in Base++ für AppActivate nicht hin. Vielleicht kann mir jemand Hilfestellung geben.

Um das Word-Fenster anzuzeigen und in den Vordergrund zu holen, sind ein paar Zeilen mehr nötig. Wir erzeugen zusätzlich ein neues, leeres Word-Dokument, machen die Word-Instanz mit der Visible-Eigenschaft sichtbar und holen das Anwendungsfenster mit der AppActivate-Methode nach vorn:

Code: Alles auswählen

Dim objWord As Word.Application

Dim objDocument As Word.Document

Set objWord = New Word.Application

Set objDocument = objWord.Documents.Add

objWord.Visible = True

AppActivate objDocument.Name

Sleep 3000

objWord.Quit

Set objWord = Nothing
Gruß
Klaus
Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 133
Registriert: Mo, 21. Sep 2015 16:22
Hat sich bedankt: 1 Mal
Danksagung erhalten: 18 Mal

Re: Word in Vordergrund holen

Beitrag von mikehoffmann »

Dein Message-LoopThread hängt nicht an der Input-Queue mit Focus und deswegen hat er gar nicht das Recht dazu, einen anderes Window und seinen Thread in den Vordergrund zu ballern. Hätte er das, sollte es mit SetForegroundWindow gehen. Selbst wenn es eine Methode dafür gäbe, die sauber programmiert wäre, dann würde diese nicht funktionieren, denn sie würde SetForegroundWindow rufen. Deswegen geht nur Schweinkram.
Viele Grüße
Michael
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Word in Vordergrund holen

Beitrag von AUGE_OHR »

hi,
Koverhage hat geschrieben: Mi, 27. Mär 2019 16:26 Ich hatte eher gehofft das es etwas wie oWord:BringWindowToTop gibt.
oWord:BringWindowToTop gibt es nicht aber

Code: Alles auswählen

DLLFUNCTION BringWindowToTop( nHwnd ) USING STDCALL FROM USER32.DLL
wie du sieht benötigt man das Handle (von Word) und nicht das Xbase++ Object.

Code: Alles auswählen

   IF nHandle!=0
      IF IsIconic(nHandle)!=0
         ShowWindow(nHandle,9)    // 9==SW_RESTORE
      ENDIF
      BringWindowToTop(nHandle)
      SetForegroundWindow(nHandle)
   ENDIF
gruss by OHR
Jimmy
Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 133
Registriert: Mo, 21. Sep 2015 16:22
Hat sich bedankt: 1 Mal
Danksagung erhalten: 18 Mal

Re: Word in Vordergrund holen

Beitrag von mikehoffmann »

Haste mal ausprobiert ob das wirklich funktioniert?
Michael
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Word in Vordergrund holen

Beitrag von AUGE_OHR »

mikehoffmann hat geschrieben: Fr, 29. Mär 2019 6:52 Haste mal ausprobiert ob das wirklich funktioniert?
JA :!:

anbei kompletter Source "pure" Xbase.
Xb_Task.zip
"pure" Xbase++ Source
(6.58 KiB) 323-mal heruntergeladen
der Source ist schon älter und ich hab inzwischen auf ProcessID umgestellt was ich am Anfang erwähnte.
da aber Klaus noch was einfacheres haben wollte hab ich was älteres raus gekramt was für seinen Zweck reicht.

beim Wechsel in einen andere App, wie im Task-Manager, sehe ich keine Problem.
mir ist klar das der Code auch dafür verwendet werden kann um Apps "abzuschiessen" aber danach wird hier nicht gefragt sondern nur wie man die App von der Taskbar wieder in den Vordergrund befördert und genau das passiert bei den Zeilen Code die ich gepostet habe.

p.s. Kommentar erbeten
gruss by OHR
Jimmy
Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 133
Registriert: Mo, 21. Sep 2015 16:22
Hat sich bedankt: 1 Mal
Danksagung erhalten: 18 Mal

Re: Word in Vordergrund holen

Beitrag von mikehoffmann »

Viel zu viel Code mit möglichen Nebeneffekten. Schreib doch mal ein Progrämmsche, das ein Word-Window, das es erst sucht, in den Vordergund schiebt, also Fenster und Focus. Da sollten 10 Zeilen Code reichen, abgesehen von den API-Wrappern. Und kein Schweinkram wie AttachDuWeisstSchonWas.
Aber erst mal die Sonne genießen!
Viele Grüße
Michael
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Word in Vordergrund holen

Beitrag von AUGE_OHR »

hi Mike
mikehoffmann hat geschrieben: Sa, 30. Mär 2019 12:55Viel zu viel Code mit möglichen Nebeneffekten.
welche Nebeneffekte meinst du konkret :?:
mikehoffmann hat geschrieben:Schreib doch mal ein Progrämmsche, das ein Word-Window, das es erst sucht, in den Vordergund schiebt, also Fenster und Focus.
ich habe doch das Demo mit vollem Source bereitgestellt.
wenn du es ausprobieren würdest wirst du feststellen das es seinen Zweck erfüllt :!:

---

Ich verstehe nicht warum du kritisiert ohne konkrete Problem zu benennen. Statt die Leute zu ermuntern etwas zu probieren verschreckst du die mit irgendwelchen angeblichen Gefahren.

JA es gibt die Gefahr des Speicherüberlauf, lost Memory oder andere Probleme die ein "Anfänger" macht aber das gilt auch für Xbase++. im übrigen gibt es von Alaska in solchen Fällen das Angebot seinen Code "Kostenlos" überprüfen zu lassen.
gruss by OHR
Jimmy
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Word in Vordergrund holen

Beitrag von Koverhage »

Bekomme den Handle nicht, hier wie ich es versucht habe.

Code: Alles auswählen

FUNCTION DlgToFront
LOCAL nHwnd := DllCall("User32.dll",DLL_STDCALL, "FindWindowA", "OpusApp", "")
IF nHwnd # 0
   BringWindowToTop( nHwnd )
   SetForegroundWindow( nHwnd )
ENDIF
RETURN NIL
Gruß
Klaus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Word in Vordergrund holen

Beitrag von AUGE_OHR »

moin,
Koverhage hat geschrieben: So, 31. Mär 2019 11:59 Bekomme den Handle nicht, hier wie ich es versucht habe.
die heisst die App im Taskmanager :?: wie ist der Titel des sichtbaren Fenster :?:

hast du dir das Demo mal angesehen :?:
gruss by OHR
Jimmy
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Word in Vordergrund holen

Beitrag von Koverhage »

Jimmy,
habe mir den Quellcode angesehen. Komme aber nicht wirklich klar damit.

OpusApp ist der Classname von Microsoft Word
Diesen Aufruf habe ich im Netz gefunden (öfters an unterschiedlichen Stellen)
Gruß
Klaus
Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 133
Registriert: Mo, 21. Sep 2015 16:22
Hat sich bedankt: 1 Mal
Danksagung erhalten: 18 Mal

Re: Word in Vordergrund holen

Beitrag von mikehoffmann »

Wenn das Fenster minimiert ist, dann muss man es erst restaurieren.
Im nachfolgenden Code muss bei Euch das :minimized durch BitAnd(GetWindowLong(hwnd,GWL_STYLE),WS_MINIMIZE) # 0 ersetzt werden.
Bei FindWindow den ersten Parameter mit NIL oder 0 angeben, den zweiten mit dem Text in der Titelzeile.
Interessanterweise funktioniert das zunächst ohne die von mir erwarteten Thread-Probleme. Aber ich hatte beim Testen einmal den Effekt, dass zwei Carets geblinkt haben. Beim Demaximieren des Word-Fensters wird bei mir nach dem Programmlauf der Internet-Browser auch demaximiert und in den Vordergrund geschoben. There hows what not hin.

#include "CockpitPlatformLibs.ch"
#include "winuser.ch"

FUNCTION Main
LOCAL wnd := FindWindow(NIL,"Document1 - Word")
MsgBox("Es kann losgehen")
IF wnd # NIL
IF wnd:minimized
ShowWindow(wnd,SW_RESTORE)
ENDIF
BringWindowToTop( wnd )
SetForegroundWindow( wnd )
ELSE
MsgBox("Nix wars.")
ENDIF
RETURN NIL
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Word in Vordergrund holen

Beitrag von AUGE_OHR »

mikehoffmann hat geschrieben: Mo, 01. Apr 2019 7:51 Wenn das Fenster minimiert ist, dann muss man es erst restaurieren.
das tut mein Code

Code: Alles auswählen

      IF IsIconic(nHandle)!=0
         ShowWindow(nHandle,9)    // 9==SW_RESTORE
      ENDIF
gruss by OHR
Jimmy
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Word in Vordergrund holen

Beitrag von Koverhage »

Ich habe das jetzt so gemacht (Ein Blick nach Delphi hilft.)

Code: Alles auswählen

FUNCTION WordToFront(cTitle)
Local cClass := "OpusApp"
Local nHwnd := 0
nHwnd := FindWindowA(cClass, NIL)
IF nHwnd # 0
   ShowWindow(nHwnd, SW_SHOW)
//   BringWindowToTop( nHwnd )
   SetForegroundWindow( nHwnd )
ENDIF
RETURN NIL
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Word in Vordergrund holen [ERLEDIGT]

Beitrag von brandelh »

Woher bzw. was ist der Begriff "OpusApp" ?
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Word in Vordergrund holen [ERLEDIGT]

Beitrag von Koverhage »

OpusApp wie vorher schon geschrieben ist der Klassenname von Word.
Ist in vielen Foren vermerkt, kann sein das der auch in der Office Dokumentation enthalten ist.
Gruß
Klaus
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Word in Vordergrund holen [ERLEDIGT]

Beitrag von Koverhage »

Ab 2013 sollte das Word Objekt auch den WHandle enthalten
IF oWord:Version == "11.0" // Word 2003
ELSEIF oWord:Version = "12.0" // Word 2007/2008
ELSEIF oWord:Version = "14.0" // Word 2010
ELSEIF oWord:Version >= "15.0" // Word 2013 und folgende
ELSE
ENDIF
Also wenn die Word Version 15.0 oder größer ist, sollte es so gehen:
nWordHandle := oWord:Hwnd
Werde das bei Gelegenheit darauf umstellen.
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Word in Vordergrund holen [ERLEDIGT]

Beitrag von brandelh »

Ich hab das mal ausprobiert und alles zusammengebaut, geht gut.
Falls es jemand braucht, hier mit den API Infos:


Code: Alles auswählen

/* Windwos API - Parameter

   BOOL ShowWindow( HWND hWnd, int  nCmdShow );
   Parameters
      hWnd     Type: HWND   A handle to the window.
      nCmdShow Type: int    Controls how the window is to be shown.


This parameter is ignored the first time an application calls ShowWindow,
if the program that launched the application provides a STARTUPINFO structure.
Otherwise, the first time ShowWindow is called, the value should be the value
obtained by the WinMain function in its nCmdShow parameter.
In subsequent calls, this parameter can be one of the following values.

Value	Meaning
SW_FORCEMINIMIZE  11 Minimizes a window, even if the thread that owns the window is not responding. This flag should only be used when minimizing windows from a different thread.
SW_HIDE            0 Hides the window and activates another window.
SW_MAXIMIZE        3 Maximizes the specified window.
SW_MINIMIZE        6 Minimizes the specified window and activates the next top-level window in the Z order.
SW_RESTORE         9 Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized window.
SW_SHOW            5 Activates the window and displays it in its current size and position.
SW_SHOWDEFAULT    10 Sets the show state based on the SW_ value specified in the STARTUPINFO structure passed to the CreateProcess function by the program that started the application.
SW_SHOWMAXIMIZED   3 Activates the window and displays it as a maximized window.
SW_SHOWMINIMIZED   2 Activates the window and displays it as a minimized window.
SW_SHOWMINNOACTIVE 7 Displays the window as a minimized window. This value is similar to SW_SHOWMINIMIZED, except the window is not activated.
SW_SHOWNA          8 Displays the window in its current size and position. This value is similar to SW_SHOW, except that the window is not activated.
SW_SHOWNOACTIVATE  4 Displays a window in its most recent size and position. This value is similar to SW_SHOWNORMAL, except that the window is not activated.
SW_SHOWNORMAL      1

*/

#define SW_SHOW  5

procedure main
   local X := " "
   cls

   @ 1,1 say "Word starten und in den Hintergrund setzen"
   @ 2,1 get X
   read

   ? "Starten ..."

   WordToFront() // cTitle)

   inkey(0.5)      // WAIT darf man nicht verwenden !

   ? "was ist ?"

   inkey(0)      // WAIT darf man nicht verwenden !

   wait


return

FUNCTION WordToFront(cTitle)
   Local cClass := "OpusApp"
   Local nHwnd := 0
   nHwnd := FindWindowA(cClass, NIL)
   IF nHwnd # 0
      ShowWindow(nHwnd, SW_SHOW)
      // BringWindowToTop( nHwnd )
      SetForegroundWindow( nHwnd )
   ENDIF
RETURN NIL

#include "dll.ch"

DLLFUNCTION FindWindowA(cClass,cTitle) USING STDCALL FROM USER32.DLL
DLLFUNCTION ShowWindow( hWnd,nCmdShow) USING STDCALL FROM USER32.DLL
DLLFUNCTION SetForegroundWindow( hWnd) USING STDCALL FROM USER32.DLL
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Word in Vordergrund holen [ERLEDIGT]

Beitrag von Koverhage »

Hubert,
warum nicht gleich in die Wissensbasis oder Xbase++ Wiki ?
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Word in Vordergrund holen [ERLEDIGT]

Beitrag von brandelh »

ist ja eigentlich von dir gefunden worden ... aber ja ;-)
Gruß
Hubert
Antworten