Word in Vordergrund holen [ERLEDIGT]
Moderator: Moderatoren
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Word in Vordergrund holen [ERLEDIGT]
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
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
Zuletzt geändert von Koverhage am Mo, 01. Apr 2019 10:03, insgesamt 1-mal geändert.
Gruß
Klaus
Klaus
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Word in Vordergrund holen
dann versuche es mit "GetTaskList"
https://www.xbaseforum.de/viewtopic.php ... etTaskList
https://www.xbaseforum.de/viewtopic.php ... etTaskList
https://www.xbaseforum.de/viewtopic.php ... etTaskList
https://www.xbaseforum.de/viewtopic.php ... etTaskList
gruss by OHR
Jimmy
Jimmy
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Word in Vordergrund holen
Ich hatte eher gehofft das es etwas wie oWord:BringWindowToTop gibt.
Gruß
Klaus
Klaus
- Herbert
- 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
wenn schon wäre es ein activate(). Das gibt es im API.
Grüsse Herbert
Immer in Bewegung...
Immer in Bewegung...
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Word in Vordergrund holen
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:
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
Klaus
- mikehoffmann
- Rekursionen-Architekt
- Beiträge: 136
- Registriert: Mo, 21. Sep 2015 16:22
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 19 Mal
Re: Word in Vordergrund holen
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
Viele Grüße
Michael
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Word in Vordergrund holen
hi,
wie du sieht benötigt man das Handle (von Word) und nicht das Xbase++ Object.
oWord:BringWindowToTop gibt es nicht aber
Code: Alles auswählen
DLLFUNCTION BringWindowToTop( nHwnd ) USING STDCALL FROM USER32.DLL
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
Jimmy
- mikehoffmann
- Rekursionen-Architekt
- Beiträge: 136
- Registriert: Mo, 21. Sep 2015 16:22
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 19 Mal
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Word in Vordergrund holen
JAmikehoffmann hat geschrieben: ↑Fr, 29. Mär 2019 6:52 Haste mal ausprobiert ob das wirklich funktioniert?
anbei kompletter Source "pure" Xbase. 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
Jimmy
- mikehoffmann
- Rekursionen-Architekt
- Beiträge: 136
- Registriert: Mo, 21. Sep 2015 16:22
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 19 Mal
Re: Word in Vordergrund holen
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
Aber erst mal die Sonne genießen!
Viele Grüße
Michael
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Word in Vordergrund holen
hi Mike
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.
welche Nebeneffekte meinst du konkret
ich habe doch das Demo mit vollem Source bereitgestellt.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.
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
Jimmy
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Word in Vordergrund holen
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
Klaus
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Word in Vordergrund holen
moin,
hast du dir das Demo mal angesehen
die heisst die App im Taskmanager wie ist der Titel des sichtbaren Fenster
hast du dir das Demo mal angesehen
gruss by OHR
Jimmy
Jimmy
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Word in Vordergrund holen
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)
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
Klaus
- mikehoffmann
- Rekursionen-Architekt
- Beiträge: 136
- Registriert: Mo, 21. Sep 2015 16:22
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 19 Mal
Re: Word in Vordergrund holen
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
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
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Word in Vordergrund holen
das tut mein Codemikehoffmann hat geschrieben: ↑Mo, 01. Apr 2019 7:51 Wenn das Fenster minimiert ist, dann muss man es erst restaurieren.
Code: Alles auswählen
IF IsIconic(nHandle)!=0
ShowWindow(nHandle,9) // 9==SW_RESTORE
ENDIF
gruss by OHR
Jimmy
Jimmy
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Word in Vordergrund holen
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
Klaus
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Word in Vordergrund holen [ERLEDIGT]
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.
Ist in vielen Foren vermerkt, kann sein das der auch in der Office Dokumentation enthalten ist.
Gruß
Klaus
Klaus
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Word in Vordergrund holen [ERLEDIGT]
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.
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
Klaus
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Word in Vordergrund holen [ERLEDIGT]
Ich hab das mal ausprobiert und alles zusammengebaut, geht gut.
Falls es jemand braucht, hier mit den API Infos:
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
Hubert
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Word in Vordergrund holen [ERLEDIGT]
Hubert,
warum nicht gleich in die Wissensbasis oder Xbase++ Wiki ?
warum nicht gleich in die Wissensbasis oder Xbase++ Wiki ?
Gruß
Klaus
Klaus
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Word in Vordergrund holen [ERLEDIGT]
ist ja eigentlich von dir gefunden worden ... aber ja
Gruß
Hubert
Hubert