Seite 1 von 1
Focusverlust von Window "bemerken"?
Verfasst: 22.06.2007 18:18
von gekkonier
Hallo, nehmen wir an, ich erstelle ein Window mit OpenWindow.
Wie kann das Programm "bemerken", dass es den Focus verliert?
Ich möchte z.B. ein Spiel pausieren, sobald woanders hin gewechselt wird.
Gibt es da eine für alle Betriebssysteme passende Möglichkeit, oder muss ich da hooken?
Verfasst: 22.06.2007 18:40
von Kaeru Gaman
> Gibt es da eine für alle Betriebssysteme passende Möglichkeit
wenn das window einen windowedscreen enthält,
funktioniert IsScreenActive() eigentlich zuverlässig.
(hab ich nur unter windows getestet, musst halt unter linux und osx mal testen)
für alle fenster sieht die Win-API lösung so aus:
Code: Alles auswählen
If GetFocus_() <> WindowID(0)
Focus = 0
Else
Focus = 1
EndIf
Verfasst: 22.06.2007 19:01
von edel
Kaeru Gaman hat geschrieben:[...]
für alle fenster sieht die Win-API lösung so aus:
Code: Alles auswählen
If GetFocus_() <> WindowID(0)
Focus = 0
Else
Focus = 1
EndIf
Mal davon ab dass das eher ne schlechte Loesung ist, wuerde
ich hier eher GetActiveWindow nutzen, damit klappt es dann
auf allen Systemen.
Verfasst: 22.06.2007 19:22
von Kaeru Gaman
> GetActiveWindow
toll, da hätte ich auch selber drauf kommen können... >__<"
> dass das eher ne schlechte Loesung ist
hast du nen tipp, wie man das LostFocus-Event direkt in der Eventschleife verarbeiten kann?
hab das Event nich gefunden in der win32.hlp
deshalb war ich nach ein wenig hin- und her-schmökern auf die GetFocus_()-lösung gekommen...
Verfasst: 22.06.2007 19:58
von edel
wm_killfocus, das ist aber nur ueber ein Callback zu bekommen.
Code: Alles auswählen
Procedure _subclass_cb_(hWnd,uMsg,wParam,lParam)
If uMsg = #WM_KILLFOCUS
Debug "Fokus verloren"
EndIf
If uMsg = #WM_SETFOCUS
Debug "Fokus bekommen"
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
#win = 0
hWnd = OpenWindow(#win,#PB_Ignore,#PB_Ignore,320,240,"leer")
SetWindowCallback(@_subclass_cb_(),#win)
Repeat
event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow
Verfasst: 22.06.2007 20:00
von ts-soft
#WM_SETFOCUS entspricht in PB #PB_Event_ActivateWindow
Fokus verlieren gibts aber nur in der Linux-Version, wenn mich nicht alles
täuscht

Verfasst: 22.06.2007 20:29
von Kaeru Gaman
> das ist aber nur ueber ein Callback zu bekommen
ach, siehe da... deshalb funzte das in der normalen event-schleife nicht... xD
dummerweise hatte ich dann nach ner API-lösung weitergesucht,
anstatt einen schritt zurückzutreten und mich auf GetActiveWindow zu besinnen....
Verfasst: 23.06.2007 01:00
von gekkonier
Vielen Dank,
Kaeru Gaman hat geschrieben:wenn das window einen windowedscreen enthält,
funktioniert IsScreenActive() eigentlich zuverlässig.
das hat geholfen!
Verfasst: 23.06.2007 03:33
von mk-soft
Hab aml etwas gelesen -> Win32.hlp
Code: Alles auswählen
;- Konstanten
Enumeration ; Window ID
#Window
EndEnumeration
Enumeration ; Menu ID
#Menu
EndEnumeration
Enumeration ; MenuItem ID
#Menu_Exit
EndEnumeration
Enumeration ; Statusbar ID
#Statusbar
EndEnumeration
Enumeration ; Gadget ID
#List
EndEnumeration
; ***************************************************************************************
;- Globale Variablen
Global exit = 0
; ***************************************************************************************
Procedure UpdateWindow()
Protected x,y,dx,dy
Protected mn,st,tb
x = 0
y = 0
mn = MenuHeight()
st = StatusBarHeight(#StatusBar)
;tb = ToolBarHeight(#ToolBar)
dx = WindowWidth(#Window)
dy = WindowHeight(#Window) - mn - st - tb
ResizeGadget(#List, x, y, dx, dy)
EndProcedure
; ***************************************************************************************
Macro LOWORD(Value)
(Value & $FFFF)
EndMacro
Macro HIWORD(Value)
(Value >> 16)
EndMacro
; ***************************************************************************************
Procedure WinCB(hWnd,uMsg,wParam,lParam)
Protected result, fActive, fMinimized, hWin
result = #PB_ProcessPureBasicEvents
Select uMsg
Case #WM_ACTIVATE
fActive = LOWORD(wParam); // activation flag
fMinimized = HIWORD(wParam); // minimized flag
hWin = lParam; // window handle
Select fActive
Case #WA_ACTIVE
AddGadgetItem(#List, -1, "WA_ACTICE")
Case #WA_CLICKACTIVE
AddGadgetItem(#List, -1, "WA_CLICKACTIVE")
Case #WA_INACTIVE
AddGadgetItem(#List, -1, "WA_INACTIVE")
EndSelect
EndSelect
ProcedureReturn result
EndProcedure
; ***************************************************************************************
;- Fenster
style = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget
If OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 400, 300, "Fenster", style)
; Menu
If CreateMenu(#Menu, WindowID(#Window))
MenuTitle("&Datei")
MenuItem(#Menu_Exit, "Be&enden")
EndIf
; Statusbar
CreateStatusBar(#Statusbar, WindowID(#Window))
; Gadgets
If CreateGadgetList(WindowID(#Window))
ListViewGadget(#List, 0,0,0,0)
EndIf
;-- Set Callback
SetWindowCallback(@WinCB())
;-- Hauptschleife
Repeat
event = WaitWindowEvent()
window = EventWindow()
menu = EventMenu()
type = EventType()
Select event
Case #PB_Event_Menu
Select menu
Case #Menu_Exit
Exit = 1
EndSelect
Case #PB_Event_Gadget
Case #PB_Event_CloseWindow
Exit = 1
Case #PB_Event_Repaint
Case #PB_Event_SizeWindow
UpdateWindow()
Case #PB_Event_MoveWindow
Case #PB_Event_ActivateWindow
Case #PB_Event_SysTray
EndSelect
Until Exit
EndIf
FF
