Focusverlust von Window "bemerken"?
Focusverlust von Window "bemerken"?
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?
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?
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> 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:
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.
Der Weise weiß, dass er ein Narr ist.
Mal davon ab dass das eher ne schlechte Loesung ist, wuerdeKaeru 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
ich hier eher GetActiveWindow nutzen, damit klappt es dann
auf allen Systemen.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> 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...
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.
Der Weise weiß, dass er ein Narr ist.
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
- 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
#WM_SETFOCUS entspricht in PB #PB_Event_ActivateWindow
Fokus verlieren gibts aber nur in der Linux-Version, wenn mich nicht alles
täuscht
Fokus verlieren gibts aber nur in der Linux-Version, wenn mich nicht alles
täuscht

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> 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....
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.
Der Weise weiß, dass er ein Narr ist.
Hab aml etwas gelesen -> Win32.hlp
FF 
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

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive