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

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