Minimiertes Window wieder in den Vordergrund?

Anfängerfragen zum Programmieren mit PureBasic.
Phil
Beiträge: 32
Registriert: 05.07.2006 10:46

Minimiertes Window wieder in den Vordergrund?

Beitrag von Phil »

Hallo,

Ich möchte ein Window in den Systray minimieren (ohne Anzeige in der Taskbar) und mit Click auf das Systrayicon das Fenster wieder im Vordergrund anzeigen lassen.

Mein Vorgehen bisher:
Bei Click auf das Systray icon --> Hidewindow(0,1)
Bei erneutem Click --> Hidewindow(0,0)

So erscheint es aber leider hinter den aktuellen Fenstern wieder.
Und ich bin mir nicht sicher, ob das Hiden eines Windows dem Minimieren entspricht oder zu viel Recourcen braucht.
PB 5.62 on Win10
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 »

Minimieren bedeutet immer, das es in der Taskbar zu sehen ist. Ein Fenster
im Systray ist also meist versteckt!

Code: Alles auswählen

SetForegroundWindow_(WindowID(0))
bringt Dein Fenster mit etwas glück wieder nach vorne :mrgreen:
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
Phil
Beiträge: 32
Registriert: 05.07.2006 10:46

Beitrag von Phil »

Danke!

Das heißt also, verstecken ist OK in diesem Fall?

Ich hab jetzt auch selbst ne Lösung gefunden:

Code: Alles auswählen

   StickyWindow(0,1)
    StickyWindow(0,0)
Das funktioniert, scheint mir aber nicht sehr elegant. :oops:
PB 5.62 on Win10
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 »

Phil hat geschrieben:Das heißt also, verstecken ist OK in diesem Fall?
Was anderes kenne ich nicht :wink:
Phil hat geschrieben: Ich hab jetzt auch selbst ne Lösung gefunden:

Code: Alles auswählen

   StickyWindow(0,1)
    StickyWindow(0,0)
Das funktioniert, scheint mir aber nicht sehr elegant. :oops:

Das laß mal lieber sein, ist ja nicht was Du erreichen willst. Du willst nicht
das Fenster sein, das ständig über den Anderen erhaben ist, sondern Du
möchtest das Fenster mit dem Fokus sein, nutze lieber obige API :wink:
(SetForGroundWindow_)
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
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Mit SetForegroundWindow_() alleine wirst du nicht glücklich werden.
PB holt das Fenster Minimiert zurück (das hat mich auch schon Nerven gekostet), du musst also noch das hier hinzufügen:

Code: Alles auswählen

SetWindowState(#Window, #PB_Window_Normal)
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag von Rokur »

Falls das Fenster ein Maximieren-Gadget hat sollte der Fensterstatus (Normal oder Maximiert) immer zwischengespeichert werden, damit dieser auch genauso wiederhergestellt werden kann. Denn es wäre für den Benutzer ärgerlich, wenn er ein maximiertes Fenster minimiert, und beim Wiederherstellen wäre es dann plötzlich nicht mehr maximiert, sondern hätte die Standardgröße.
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 »

Man kann sich den Aufwand aber sparen. Einfach das Event im Callback
abfangen und das minimieren garnicht ausführen :wink:

Braucht man den alten Zustand nicht speichern, nur Fenster verstecken oder
Anzeigen. Ist immer richtig.
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
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 »

Hier mal ein Beispielcode:

Code: Alles auswählen

#frmMain = 0
#SysTrayIcon = 0

Procedure Win_CB(hWnd, uMsg, wParam, lParam)
  Protected result = #PB_ProcessPureBasicEvents
  
  Select uMsg
    Case #WM_SYSCOMMAND
      Select wParam
        Case #SC_MINIMIZE
          HideWindow(#frmMain, #True)
          AddSysTrayIcon(#SysTrayIcon, WindowID(#frmMain), ImageID(LoadImage(#PB_Any, #PB_Compiler_Home + "Examples\Sources\Data\CdPlayer.ico")))
          SysTrayIconToolTip(#SysTrayIcon, GetWindowTitle(#frmMain)) 
          result = 0
      EndSelect
  EndSelect
  
  ProcedureReturn result
EndProcedure


Define WinFlags = #PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget

OpenWindow(#frmMain, #PB_Ignore, #PB_Ignore, 640, 480, "void", WinFlags)

SetWindowCallback(@Win_CB())

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    
    Case #PB_Event_SysTray
      Select EventType()
        Case #PB_EventType_LeftClick
          HideWindow(#frmMain, #False)
          RemoveSysTrayIcon(#SysTrayIcon)
      EndSelect
  EndSelect
ForEver
Wenns also für Windows ist, sollte dies am einfachsten sein.

Bei grösseren Anwendungen erspart man sich so auch die diversen
#WM_SIZE und #WM_MOVE, die sonst noch ackern würden :mrgreen:
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
Antworten