Seite 1 von 1

Minimiertes Window wieder in den Vordergrund?

Verfasst: 10.05.2009 11:24
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.

Verfasst: 10.05.2009 11:28
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:

Verfasst: 10.05.2009 11:37
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:

Verfasst: 10.05.2009 11:44
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_)

Verfasst: 11.05.2009 12:21
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)

Verfasst: 11.05.2009 15:27
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.

Verfasst: 11.05.2009 15:42
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.

Verfasst: 11.05.2009 16:12
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: