Seite 1 von 1

AppFocus auf Word setzen

Verfasst: Mo, 10. Mär 2014 9:07
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 ?

Re: AppFocus auf Word setzen

Verfasst: Mo, 10. Mär 2014 9:23
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()



Re: AppFocus auf Word setzen

Verfasst: Mo, 10. Mär 2014 9:28
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

Re: AppFocus auf Word setzen

Verfasst: Sa, 22. Mär 2014 18:40
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 )

Re: AppFocus auf Word setzen

Verfasst: So, 23. Mär 2014 10:07
von Koverhage
Hallo Jimmy,

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