Dem Programmfenster den Focus geben - wie?

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

Beitrag von Sicro »

Ich habe mich für den Code von roherter entschieden.

Das Fenster bekommt jetzt aber nur noch den Focus, wenn ich das Fenster über das
Popup-Menü wieder anzeigen lasse, obwohl bei der linken Maustaste die gleiche Prozedur
aufgerufen wird. :?

Könnt ihr mir vielleicht sagen, wo der Fehler liegt?

Code: Alles auswählen

;- Konstanten
#WM_SIZE = 5
#SIZE_MINIMIZED = 1

;- Enumerations
Enumeration
  #Window_0
EndEnumeration
Enumeration
  #Text_0
  #Button_0
EndEnumeration

;- Prozeduren
Procedure.b Open_Window_0()
  If OpenWindow(#Window_0, 532, 460, 191, 71, #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Laufzeit")
    If CreateGadgetList(WindowID())
      TextGadget(#Text_0, 10, 10, 170, 20, "", #PB_Text_Center | #PB_Text_Border)
      ButtonGadget(#Button_0, 30, 40, 130, 20, "Anzeige aktualisieren")
      If CreatePopupMenu(0)
        MenuItem(1, "Anzeigen")
        MenuItem(2, "Beenden")
      EndIf
    EndIf
    ProcedureReturn 1
  EndIf
EndProcedure
Procedure ShowTrayIcon(a.b)
  If a = 1
    AddSysTrayIcon(0,WindowID(),UseImage(0))
    HideWindow(0,1)
  Else
    RemoveSysTrayIcon(0)
    HideWindow(0,0)
    ActivateWindow()
  EndIf
EndProcedure
Procedure.l WinCallback(WindowID,Message,wParam,lParam)
  If Message = #WM_SIZE And wParam = #SIZE_MINIMIZED
      ShowTrayIcon(1)
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure.s Zeit()
  lSec.l = ElapsedMilliseconds() / 1000
  bHr.b = lSec / 3600: lSec % 3600
  bMin.b = lSec / 60: lSec % 60
  
  sHr.s = Str(bHr): sMin.s = Str(bMin): sSec.s = Str(lSec)
  If Len(sHr)  = 1: sHr  = "0" + sHr:  EndIf
  If Len(sMin) = 1: sMin = "0" + sMin: EndIf
  If Len(sSec) = 1: sSec = "0" + sSec: EndIf
  
  sAusgabe = sHr + ":" + sMin + ":" + sSec
  ProcedureReturn sAusgabe
EndProcedure

;- Haupt-Code
If Open_Window_0() = 0: End: EndIf
SetWindowCallback(@WinCallback())
LoadImage(0, "D:\CLOCK01.ICO")

Repeat
  EventID.l = WaitWindowEvent()
  Select EventID
    Case #PB_EventGadget
      If EventGadgetID() = #Button_0
        If EventType() = #PB_EventType_LeftClick
          SetGadgetText(#Text_0, Zeit())
        EndIf
      EndIf
    Case #PB_Event_SysTray
      Select EventType()
        Case #PB_EventType_LeftClick:  ShowTrayIcon(0)
        Case #PB_EventType_RightClick: DisplayPopupMenu(0, WindowID())
      EndSelect
    Case #PB_Event_Menu
      Select EventMenuID()
        Case 1: ShowTrayIcon(0)
        Case 2: EventID = #PB_EventCloseWindow
      EndSelect
  EndSelect
Until EventID = #PB_EventCloseWindow

FreeImage(0)
End
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 »

Ändere mal die folgende Prozedure ab:

Code: Alles auswählen

Procedure ShowTrayIcon(a.b)
  If a = 1
    AddSysTrayIcon(0,WindowID(),UseImage(0))
    HideWindow(0,1)
  Else
    RemoveSysTrayIcon(0)
    HideWindow(0,0)
    ;ActivateWindow()
    SetForegroundWindow_(WindowID(#Window_0))
  EndIf
EndProcedure
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
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag von Sicro »

Mit der Api-Prozedur "SetForegroundWindow" habe ich es bereits probiert - und es hat auch
geklappt. Ich dachte nur, dass ich wieder irgenteinen Fehler gemacht habe und die
ActivateWindow-Prozedur deswegen nicht funktioniert.

Auf jeden Fall nochmals vielen Dank an alle :allright:

Mfg DerProgger
Antworten