AppFocus auf Word setzen

Einbindung von Office-Komponenten wie Word, Excel usw.

Moderator: Moderatoren

Antworten
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:

AppFocus auf Word setzen

Beitrag von Koverhage »

Unter XP bekommt Word den Focus wenn ich in Xbase++ aufrufe.
Unter Windows 7 bekommt Word nicht den Focus sondern wird in der Taskleiste abgelegt.
Manche Kunden rufen dann an, das Programm hängt, oder ähnliches.
Wir kann ich erreichen, das den Focus erhält und angezeigt wird ?
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: AppFocus auf Word setzen

Beitrag von brandelh »

eigentlich müsste das oWord:visible := .t. (oder so ähnlich machen).

In dem Beispiel von Alaska ...\XPPW32\source\samples\activex\msword\feed.prg

Code: Alles auswählen

*  oDoc:close() // das Dokument nicht schließen
*  oWord:Quit() // Word nicht beenden
oWord:destroy() // Die Xbase++ Referenz auf das ActiveX Objekt von Word schließen.
bei mir erscheint die schwarze CMD Box vor dem Word-Dokument, aber ich kann dort hinein clicken.
Wenn man statt einem CRT / VIO Programm ein normales Fenster hätte, sollte Word automatisch vorne sein (Windows 7 Pro 64Bit ... )

Du kannst aber auch jedes Fenster explizit suchen und nach vorne bringen, hier ist ein Beispiel um ein Fenster zu schließen, aber statt CloseWindow() kannst du was passendes wählen , toFront oder setfocus suchen ;-)

Code: Alles auswählen

*--------------------------------------------------------------------------
// #include "ot4xb.ch"
// #include "dll.ch"
*--------------------------------------------------------------------------
function GetStandardProgramm(cFile, cPath)   // cPath force to EXE
   local cExe := ChrR(0,260) // MAX_PATH is 260
   if empty(cPath)
      cPath := cAppDir()
   endif
   if @shell32:FindExecutableA(cFile, cPath, @cExe) < 32
      cExe := ""
   else
      cExe := TrimZ(cExe)
   end
return cExe
*--------------------------------------------------------------------------
function CloseRunningExe(cTitle)
   local nHWD, lOK := .f.
   nHWD := FindWindow(cTitle)
   if ! empty(nHWD)
      CloseWindow(nHWD)
      sleep(50)
      nHWD := FindWindow(cTitle)
      lOK  := empty(nHWD)
   endif
return lOK
*--------------------------------------------------------------------------
function FindWindow(cTitle)
   local nHWD := 0
   if ! empty(cTitle)
      nHWD := @User32:FindWindowA(0,cTitle)
   endif
return nHWD
*--------------------------------------------------------------------------
#define WM_SYSCOMMAND   0x0112
#define SC_CLOSE        0xF060
function CloseWindow(nHWD)
   @User32:SendMessageA(nHWD, WM_SYSCOMMAND, SC_CLOSE, 0)
return .t. // Erfolg prüfen ?
*--------------------------------------------------------------------------
function GetLastError() // Errorcodes: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381%28v=vs.85%29.aspx
return @Kernel32:GetLastError()


Gruß
Hubert
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: AppFocus auf Word setzen

Beitrag von brandelh »

Tom hat es hier auf den Punkt gebracht, einfach beides zusammenbauen ;-)
:arrow: http://www.xbaseforum.de/viewtopic.php?f=23&t=4518

Code: Alles auswählen

FUNCTION DlgToFront(oDlg)
LOCAL nDlgHandle:=oDlg:GetHwnd()
BringWindowToTop( nDlgHandle )
SetForegroundWindow( nDlgHandle )
RETURN NIL

DLLFUNCTION BringWindowToTop( nHwnd )           USING STDCALL FROM USER32.DLL
DLLFUNCTION SetForegroundWindow( nHwnd )        USING STDCALL FROM USER32.DLL
Gruß
Hubert
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: AppFocus auf Word setzen

Beitrag von AUGE_OHR »

Koverhage hat geschrieben:Unter XP bekommt Word den Focus wenn ich in Xbase++ aufrufe.
Unter Windows 7 bekommt Word nicht den Focus sondern wird in der Taskleiste abgelegt.
hm ... "wie" rufst du den Word auf ?

@Hubert
wenn es in der Taskleiste liegt nützen IMHO die beiden Function nichts.

Code: Alles auswählen

#define SW_HIDE             0
#define SW_SHOWNORMAL       1
#define SW_NORMAL           1
#define SW_SHOWMINIMIZED    2
#define SW_SHOWMAXIMIZED    3
#define SW_MAXIMIZE         3
#define SW_SHOWNOACTIVATE   4
#define SW_SHOW             5
#define SW_MINIMIZE         6
#define SW_SHOWMINNOACTIVE  7
#define SW_SHOWNA           8
#define SW_RESTORE          9
#define SW_SHOWDEFAULT      10
#define SW_MAX              10

DLLFUNCTION ShowWindow( nHwnd, nCmdShow ) USING STDCALL FROM USER32.DLL
DLLFUNCTION BringWindowToTop( nHwnd ) USING STDCALL FROM USER32.DLL
DLLFUNCTION SetForegroundWindow( nHwnd ) USING STDCALL FROM USER32.DLL

// wenn minimiert
         ShowWindow( nHwnd, SW_RESTORE )
         ShowWindow( nHwnd, SW_SHOWNORMAL )
// Fenster nach vorne ( Z-Achse ) bringen
         BringWindowToTop( nHwnd )
         SetForegroundWindow( nHwnd )
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: AppFocus auf Word setzen

Beitrag von Koverhage »

Hallo Jimmy,

so wie hier beschrieben
http://www.xbaseforum.de/viewtopic.php? ... 586#p84437
Gruß
Klaus
Antworten