Seite 1 von 2

Dem Programmfenster den Focus geben - wie?

Verfasst: 24.08.2005 23:21
von Sicro
Hallo,

ich habe ein Programm geschrieben, das sich beim Minimieren in den Info-Bereich der Taskleiste ablegt und das
Programmfenster dabei verstecken lässt. Klickt man nun auf das Trayicon, wird das Trayicon wieder entfernt und
das Programmfenster erscheint wieder auf dem Desktop - allerdings ohne Focus...

Meine Frage nun: Wie gebe ich dem Programmfenster den Focus?

Ein Teil meines Codes:

Code: Alles auswählen

Repeat
  EventID.l = WaitWindowEvent()
  Select EventID
    Case 5
      ; Das Fenster wurde minimiert
      AddSysTrayIcon(0, WindowID(), UseImage(0))
      HideWindow(0, 1)
    Case #PB_Event_SysTray
      If EventType() = #PB_EventType_LeftClick
        ; Es wurde auf das SysTrayIcon geklickt
        RemoveSysTrayIcon(0)
        HideWindow(0, 0)
        UseWindow(0)
        ActivateWindow()
      EndIf
  EndSelect
Until EventID = #PB_EventCloseWindow
Mfg DerProgger

Verfasst: 24.08.2005 23:30
von Franky
mit SetFocus_()

Verfasst: 24.08.2005 23:55
von Hroudtwolf

Code: Alles auswählen

SetFocus_(windowid(#dasfensterumdasesgeht))

Verfasst: 25.08.2005 00:22
von Sicro
Hallo Franky,

vielen Dank. Ich werde den Befehl testen, sobald ich die Vollversion von PureBasic habe :)

Ich habe gerade ein Testprogramm geschrieben mit zwei Fenstern und da kann ich mit
dem Befehl "ActivateWindow()" dem inaktiven Fenster den Focus geben.

Wieso funktioniert das nicht, wenn es nur ein Fenster ist?

Mfg DerProgger

Verfasst: 25.08.2005 01:09
von ts-soft
Demo:

Code: Alles auswählen

Procedure SetForeGroundWindow(Window)
  DLL = OpenLibrary(#PB_Any, "user32.dll")
  If DLL
    CallFunction(DLL, "SetForegroundWindow", WindowID(Window))
    CloseLibrary(DLL) 
  EndIf 
EndProcedure

SetForeGroundWindow(#Window)
Vollversion:

Code: Alles auswählen

SetForegroundWindow_(WindowID(#Window))
Sollte eigentlich gehen

Verfasst: 25.08.2005 07:58
von Kiffi
> Wieso funktioniert das nicht, wenn es nur ein Fenster ist?

eigentlich hast Du recht.

Auszug aus der PB-Hilfe:
ActivateWindow
Aktiviert das aktuelle Fenster und zeigt dieses im Vordergrund an.
Sollte eigentlich so funktionieren wie beschrieben.
Keine Ahnung, warum es bei Dir nicht klappt.

Grüße ... Kiffi

Verfasst: 26.08.2005 17:12
von Sicro
@ ts-soft:
Die Demo-Version funktioniert - Danke :)

@ Kiffi:
Bei dir funktioniert also der Code, den ich geschrieben habe, wenn du in zu ende schreibst?

Mfg DerProgger

Verfasst: 27.08.2005 01:07
von Sicro
Juhu, ich habe den Fehler gefunden. Nun funktioniert es auch mit ActivateWindow() :D

In der Hilfe von PB habe ich keine vordefinierte Konstante für das "Minimiert"-Event
gefunden. Deshalb habe ich einfach mal die WindowEvents im Debug-Fenster
überwacht und habe herausbekommen, dass die Zahl "5" zurückgegeben wird,
wenn das Fenster minimiert wird.

Ich habe nun mal die Abfrage mit der Zahl "5" aus der WaitWindowEvent-Schleife
herausgenommen, das Fenster beim Programmstart bereits verstecken und das
TrayIcon erstellen lassen. Nun funktioniert es auch mit ActivateWindow().

Aber wie fragt man nun richtig ab, ob das Fenster minimiert wurde, damit ich das
Programm wieder so umbauen kann, wie ich es eigentlich haben möchte?

Mfg DerProgger

window

Verfasst: 27.08.2005 08:43
von roherter

Verfasst: 27.08.2005 13:08
von Spirit
IsIconic_(WindowID()) gibt einen Wert ungleich null zurück, wenn das Fenster minimiert ist.