Focusverlust von Window "bemerken"?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Focusverlust von Window "bemerken"?

Beitrag 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?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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 
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Beitrag von gekkonier »

Vielen Dank,
Kaeru Gaman hat geschrieben:wenn das window einen windowedscreen enthält,
funktioniert IsScreenActive() eigentlich zuverlässig.
das hat geholfen!
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten