Dem Programmfenster den Focus geben - wie?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Dem Programmfenster den Focus geben - wie?

Beitrag 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
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

mit SetFocus_()
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag von Hroudtwolf »

Code: Alles auswählen

SetFocus_(windowid(#dasfensterumdasesgeht))
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag 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
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 »

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
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
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag 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
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag 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
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

window

Beitrag von roherter »

Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
Spirit
Beiträge: 174
Registriert: 13.04.2005 19:09

Beitrag von Spirit »

IsIconic_(WindowID()) gibt einen Wert ungleich null zurück, wenn das Fenster minimiert ist.
Antworten