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 ?
AppFocus auf Word setzen
Moderator: Moderatoren
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: AppFocus auf Word setzen
eigentlich müsste das oWord:visible := .t. (oder so ähnlich machen).
In dem Beispiel von Alaska ...\XPPW32\source\samples\activex\msword\feed.prg
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
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.
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
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: AppFocus auf Word setzen
Tom hat es hier auf den Punkt gebracht, einfach beides zusammenbauen
http://www.xbaseforum.de/viewtopic.php?f=23&t=4518
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
Hubert
- 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: AppFocus auf Word setzen
hm ... "wie" rufst du den Word auf ?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.
@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
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: