Focus auf eigenes Fenster setzen
-
- Beiträge: 64
- Registriert: 22.11.2020 20:05
- Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate
Focus auf eigenes Fenster setzen
Hi,
habe mir einen kleinen Timer gebaut, der als Minifenster im Sticky-Modus in der Bildschirmecke (oder woanders) sitzt.
Es ist jetzt immer vor allen fremden Fenstern sichbar - also ok. Nun verliert es ja den EingabeFocus, sobald ich mit fremden Programmen aller Art arbeite - auch ok.
Wenn der Timer aber nun Alarm auslöst, möchte ich, das er sich den Eingabefocus auf sein Fenster zurückholt, damit ich den Timer nahtlos mit der Tastatur bedienen kann, ohne ihm vorher mit der Maus den Eingabefocus geben zu müssen.
Soviel ich auch suche und probiere - ich krieg das nicht hin...
Kann jemand helfen?
habe mir einen kleinen Timer gebaut, der als Minifenster im Sticky-Modus in der Bildschirmecke (oder woanders) sitzt.
Es ist jetzt immer vor allen fremden Fenstern sichbar - also ok. Nun verliert es ja den EingabeFocus, sobald ich mit fremden Programmen aller Art arbeite - auch ok.
Wenn der Timer aber nun Alarm auslöst, möchte ich, das er sich den Eingabefocus auf sein Fenster zurückholt, damit ich den Timer nahtlos mit der Tastatur bedienen kann, ohne ihm vorher mit der Maus den Eingabefocus geben zu müssen.
Soviel ich auch suche und probiere - ich krieg das nicht hin...
Kann jemand helfen?
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
-
- Beiträge: 64
- Registriert: 22.11.2020 20:05
- Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate
Re: Focus auf eigenes Fenster setzen
Jo - genau dies war auch meine erste Idee^^
Zitat dazu aus der aktuellen Hilfe:
"Der Befehl wird nur den Fokus innerhalb Ihres Programms verändern. Sie können damit nicht das Programm in den Vordergrund bringen, wenn ein anderes Programm den Fokus hat. "
Zitat dazu aus der aktuellen Hilfe:
"Der Befehl wird nur den Fokus innerhalb Ihres Programms verändern. Sie können damit nicht das Programm in den Vordergrund bringen, wenn ein anderes Programm den Fokus hat. "
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Re: Focus auf eigenes Fenster setzen
Schau mal hier: http://www.chabba.de/ -> Linux PureBasic API -> Window -> In den Hintergrund/Vordergrund legen
Vielleicht passt das ja.
Vielleicht passt das ja.
Hygge
-
- Beiträge: 64
- Registriert: 22.11.2020 20:05
- Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate
Re: Focus auf eigenes Fenster setzen
ahh, ok - fummel mich da mal durch und bau das ein - könnte passen - Danke dir.
Ich geb dann Bescheid...
Ich geb dann Bescheid...
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
-
- Beiträge: 64
- Registriert: 22.11.2020 20:05
- Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate
Re: Focus auf eigenes Fenster setzen
kurzes Feedback:Kiffi hat geschrieben: ↑09.11.2021 01:45 Schau mal hier: http://www.chabba.de/ -> Linux PureBasic API -> Window -> In den Hintergrund/Vordergrund legen
Vielleicht passt das ja.
hat keine Wirkung gezeigt. Vermutlich macht dies das gleiche, wie jetzt die aktuelle StickyWindow-Funktion in PB.
Sobals das Fenster einmal den Focus verloren hat, kann es sich ihn damit nicht zurückholen.
Hab das allerdings jetzt nicht mit den sekundären Fenster probiert, sondern direkt mit dem Hauptfenster, welches ja bereits im Vordergrund (Sticky-modus) war.
Grundsätzlich geht das aber unter Linux. Hab ein Programm (kein eigenes), daß nach Fertigstellung der Aufgabe in den Vordergrund poppt und auch gleich den Focus hat - ich kann also mit Enter die Meldung sofort bestätigen.
Die Frage ist, wie der Programmierer das gemacht hat^^
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Re: Focus auf eigenes Fenster setzen
Hallo jogo,
ich habe mir vor ewigen Zeiten mit folgendem beholfen.
Jürgen
ich habe mir vor ewigen Zeiten mit folgendem beholfen.
Code: Alles auswählen
; Programm: Testprogramm OnTop für Linux
; Datum: 10.11.2021
; Purebasic: 5.73 LTS (Linux 64bit)
;
;Verweis: http://forums.purebasic.com/german/viewtopic.php?f=21&t=32529&sid=2dd30ce33b8e458c473a777e96d0dc08
;
EnableExplicit
Global Fenster.s = "Rechner" ;hier den entsprechenden Fenstertitel eintragen
Enumeration FormWindow
#Window_Main
EndEnumeration
Enumeration FormGadget
#TextGadget
EndEnumeration
Enumeration
#TimerNummerOnTop
EndEnumeration
Procedure FensterOnTop(gWinTitle.s)
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
Protected.i gProgrammId
gProgrammId = RunProgram("wmctrl", "-a " + #DQUOTE$ + gWinTitle + #DQUOTE$, "", #PB_Program_Hide)
If gProgrammId = 0
MessageRequester("Linux wmctrl", "wmctrl fehlt, bitte installieren z.B.: apt install wmctrl")
EndIf
CompilerEndIf
EndProcedure
;
Procedure Main()
Protected EventID
If OpenWindow(#Window_Main,10,10,300,200,"OnTop-Test")
AddWindowTimer(#Window_Main, #TimerNummerOnTop, 5000) ;alle 5.000ms.
TextGadget(#TextGadget, 20, 20, 260, 100, "Alle 5 Sekunden wird das Fenster '"+Fenster.s+"' in den Vordergrund geholt (wenn es läuft)", #PB_Text_Border)
;
Repeat ; Start of the event loop
EventID = WaitWindowEvent()
;
;- Timer-Auswertung
Select EventID
Case #PB_Event_Timer
If EventTimer() = #TimerNummerOnTop
FensterOnTop(Fenster.s)
EndIf
EndSelect
;
Until EventID = #PB_Event_CloseWindow ; End of the event loop
Else
Debug "Window konnte nicht geöffnet werden"
EndIf
EndProcedure
;
Main()
Re: Focus auf eigenes Fenster setzen
Mit GTK API geht es nicht. Das mit wmctrl habe ich auch gelesen. Muss aber eventuell erst nachinstalliert werden.
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
-
- Beiträge: 64
- Registriert: 22.11.2020 20:05
- Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate
Re: Focus auf eigenes Fenster setzen
Hi Jürgen,
dein Code tut genau das, was er soll: er holt ein Fenster in den Vordergrund. Sehr nützlich, um ein fremdes (oder auch das eigene) Fenster zu steuern, welches nicht im Vordergrund ist. Vielen Dank.
In meinem Fall jedoch wirkt dies nicht, weil mein Minifenster ja bereits permanent im Vordergrund ist (durch die PB-Funktion StickyWindow(0,#True))-
Das Fenster hat nur nicht den Tastatur- /eingabefokus, so das ich beim Alarm das Fenster erstmal mit der Maus den Fokus geben muß (bzw. mit der Maus bedienen muß).
Mein Fenster, welches ja bereits im Vordergrund ist, soll sich also bei bestimmten Bedingungen selbst den Tastaturfokus holen, so das ich es z.B. mit esc bedienen könnte - auch wenn ich zuvor gerade mit den Browser beschäftigt war und dieser den Fokus hat.
dein Code tut genau das, was er soll: er holt ein Fenster in den Vordergrund. Sehr nützlich, um ein fremdes (oder auch das eigene) Fenster zu steuern, welches nicht im Vordergrund ist. Vielen Dank.
In meinem Fall jedoch wirkt dies nicht, weil mein Minifenster ja bereits permanent im Vordergrund ist (durch die PB-Funktion StickyWindow(0,#True))-
Das Fenster hat nur nicht den Tastatur- /eingabefokus, so das ich beim Alarm das Fenster erstmal mit der Maus den Fokus geben muß (bzw. mit der Maus bedienen muß).
Mein Fenster, welches ja bereits im Vordergrund ist, soll sich also bei bestimmten Bedingungen selbst den Tastaturfokus holen, so das ich es z.B. mit esc bedienen könnte - auch wenn ich zuvor gerade mit den Browser beschäftigt war und dieser den Fokus hat.
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Re: Focus auf eigenes Fenster setzen
Hallo jogo,
dann hatte ich es wohl nicht richtig begriffen.
Nun noch ein Versuch in der Hoffnung es richtig verstanden zu haben.
In diesem Fall verwende ich als Deine Bestimmung den Timer (umschaltbar per Button auf Thread-Bedingung),
das Programm setzt den Focus auf sich selbst (per wmctrl), druck ESC-Taste wird angezeigt.
Bei Programmstart ist Sticky ausgeschaltet (umschaltbar per Button).
Jürgen
dann hatte ich es wohl nicht richtig begriffen.
Nun noch ein Versuch in der Hoffnung es richtig verstanden zu haben.
In diesem Fall verwende ich als Deine Bestimmung den Timer (umschaltbar per Button auf Thread-Bedingung),
das Programm setzt den Focus auf sich selbst (per wmctrl), druck ESC-Taste wird angezeigt.
Bei Programmstart ist Sticky ausgeschaltet (umschaltbar per Button).
Code: Alles auswählen
; Programm: Testprogramm OnTop für Linux, Focus auf sich selbst
; Datum: 11.11.2021
; Purebasic: 5.73 LTS (Linux 64bit)
;
;Verweis: http://forums.purebasic.com/german/viewtopic.php?f=21&t=32529&sid=2dd30ce33b8e458c473a777e96d0dc08
;
EnableExplicit
Global Fenster.s = "OnTop-Focus Test" ;hier den entsprechenden Fenstertitel eintragen
Global ZustandStickyAktiv = #False
Global BedingungTimer = #True
Global ThreadNrTEST = 0
Global FlagThreadBeenden = #False
Enumeration FormWindow
#Window_Main
EndEnumeration
Enumeration FormGadget
#ButtonSticky
#ButtonBedingung
#TextGadget1
#TextGadget2
#TextGadget3
EndEnumeration
Enumeration
#TimerNummerOnTop
EndEnumeration
;
Procedure FensterOnTop(gWinTitle.s)
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
Protected.i gProgrammId
gProgrammId = RunProgram("wmctrl", "-a " + #DQUOTE$ + gWinTitle + #DQUOTE$, "", #PB_Program_Hide)
If gProgrammId = 0
MessageRequester("Linux wmctrl", "wmctrl fehlt, bitte installieren z.B.: apt install wmctrl")
EndIf
CompilerEndIf
EndProcedure
;
Procedure ThreadBedingungBearbeiten(z)
Static BedingungZustand=0
While FlagThreadBeenden = #False
BedingungZustand = BedingungZustand +1
If BedingungTimer = #False
If BedingungZustand > 5000 ;ca. 5.000ms
BedingungZustand = 0
FensterOnTop(Fenster.s)
EndIf
Delay(1)
EndIf
Wend
ThreadNrTEST = 0
EndProcedure
;
Procedure ZeigeFensterZustand(Zustand)
If Zustand = -1
SetGadgetText(#TextGadget3, "Fenster inaktiv")
SetGadgetColor(#TextGadget3, #PB_Gadget_BackColor, RGB(255,0,0))
Else
SetGadgetText(#TextGadget3, "Fenster aktiv")
SetGadgetColor(#TextGadget3, #PB_Gadget_BackColor, RGB(0,255,0))
EndIf
EndProcedure
;
Procedure ZeigeStickyZustand(Zustand)
If Zustand = #True ;bisher als Sticky
ZustandStickyAktiv = #False
StickyWindow(#Window_Main, ZustandStickyAktiv)
SetGadgetText(#ButtonSticky, "Sticky is OFF")
Else ;bisher ohne Sticky
ZustandStickyAktiv = #True
StickyWindow(#Window_Main, ZustandStickyAktiv)
SetGadgetText(#ButtonSticky, "Sticky is ON")
EndIf
EndProcedure
;
Procedure ZeigeBedingungZustand(Zustand)
If Zustand = #True ;bisher als Timer
BedingungTimer = #False
FlagThreadBeenden = #False
If IsThread(ThreadNrTEST) = 0
ThreadNrTEST = CreateThread(@ThreadBedingungBearbeiten(), #False)
EndIf
SetGadgetText(#ButtonBedingung, "Bedingung is Thread")
Else ;bisher als Thread
FlagThreadBeenden = #True
BedingungTimer = #True
SetGadgetText(#ButtonBedingung, "Bedingung is Timer")
EndIf
EndProcedure
;
Procedure Main()
Protected EventID, MenueID, GadgetID
Protected TasteESC = 27
Protected ZustandFensterAktiv = -1
If OpenWindow(#Window_Main,10,10,340,200, Fenster.s)
AddWindowTimer(#Window_Main, #TimerNummerOnTop, 5000) ;alle 5.000ms.
AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, TasteESC)
TextGadget(#TextGadget1, 20, 20, 300, 30, "Bei Focus erhalten, Taste ESC drücken.", #PB_Text_Border)
TextGadget(#TextGadget2, 20, 70, 300, 30, "..warte auf ESC-Taste", #PB_Text_Border)
ButtonGadget(#ButtonSticky, 20, 110, 120, 30, "Sticky is OFF")
ButtonGadget(#ButtonBedingung, 160, 110, 160, 30, "Bedingung is Timer")
TextGadget(#TextGadget3, 20, 160, 300, 30, "Fenster aktiv", #PB_Text_Border)
;
Repeat ; Start of the event loop
EventID = WaitWindowEvent()
GadgetID = EventGadget()
MenueID = EventMenu()
;
If ZustandFensterAktiv <> GetActiveWindow()
ZustandFensterAktiv = GetActiveWindow()
ZeigeFensterZustand(ZustandFensterAktiv)
EndIf
;- Event-Auswertung
Select EventID
Case #PB_Event_Timer
If EventTimer() = #TimerNummerOnTop
If BedingungTimer = #True
FensterOnTop(Fenster.s)
EndIf
EndIf
;
Case #PB_Event_Gadget
If GadgetID = #ButtonSticky
ZeigeStickyZustand(ZustandStickyAktiv)
EndIf
;
If GadgetID = #ButtonBedingung
ZeigeBedingungZustand(BedingungTimer)
EndIf
;
Case #PB_Event_Menu
If MenueID = TasteESC ;ESC
SetGadgetText(#TextGadget2, "ESC gedrückt, Zeitpunkt: "+FormatDate("%hh:%ii:%ss", Date()))
EndIf
EndSelect
;
Until EventID = #PB_Event_CloseWindow ; End of the event loop
FlagThreadBeenden = #True
Else
Debug "Window konnte nicht geöffnet werden"
EndIf
EndProcedure
;
Main()