SysTrayIconEvent per Callback

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

SysTrayIconEvent per Callback

Beitrag von Kai »

Wie kann ich per Callback herausfinden wann auf dem SystrayIcon geklickt wurde, da ich schon etwas ausführen möchte sobald auf dem icon geklickt wird und nicht erst wenn die maustaste wieder losgelassen wird.

Ich möchte Mein Fenster wie das Startmenü handeln,
klickt man auf dem SysTrayIcon zeigt er es an, bei einen weiteren klick wird es wieder versteckt.
Ausserdem sobald es inactive wird.
Wenn ich nun aber die PB Befehle benutze wird das Fenster ja sofort inactive sobald ich im Systray klicke, verschwindet also, und taucht danach gleich wieder auf.
Oh Man, ich glaub ich schreibe zu viel^^

Sample

Code: Alles auswählen

EnableExplicit

Procedure.s ExePath()
 Protected temp$ = Space(#MAX_PATH)
 GetModuleFileName_(0, @temp$, #MAX_PATH)
 ProcedureReturn GetPathPart(temp$)
EndProcedure

If OpenWindow(0, 0, 0, 0, 0, "", #PB_Window_Invisible)
 DisableWindow(0, 1)
Else
 End
EndIf
If OpenWindow(1, 0, 0, 200, 200, "TEST", #PB_Window_ScreenCentered|#PB_Window_SystemMenu, WindowID(0))
 StickyWindow(1, 1)
Else
 End
EndIf

Procedure WindowCallback(hWnd, Msg, wParam, lParam)
 Protected Result.l, title$, len.l
 Result = #PB_ProcessPureBasicEvents
 
 Select Msg
 
  Case #WM_ACTIVATE
   
   If wParam = #WA_INACTIVE
    
    If IsWindowVisible_(hWnd) = 1
     Debug "Hide while Inactive"
     ShowWindow_(hWnd, #SW_HIDE)
    EndIf
   
   EndIf
   
   If wParam = #WA_ACTIVE Or wParam = #WA_CLICKACTIVE
    SetForegroundWindow_(hWnd)
   EndIf
    
 EndSelect
  
 ProcedureReturn Result
EndProcedure

Global hImg.l = LoadImage(#PB_Any, ExePath() + "icon.ico")
If hImg <> 0
 AddSysTrayIcon(0, WindowID(1), ImageID(hImg))
Else
 End
EndIf

SetWindowCallback(@WindowCallback(), 1)

Global WindowEvent.l
Repeat
 WindowEvent = WindowEvent()
 Select WindowEvent
  Case #WM_ACTIVATE
   Debug "inactive"
  
  Case #PB_Event_SysTray
   If EventType() = #PB_EventType_LeftClick
    If IsWindowVisible_(WindowID(1))
     Debug "Hide while Systrayicon Click"
     HideWindow(1, 1)
    Else
     Debug "Show while Systrayicon Click"
     HideWindow(1, 0)
    EndIf
   EndIf
  
  Case #PB_Event_CloseWindow: End
  Case #False: Delay(1)
 EndSelect
ForEver
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag von Kai »

Keiner Eine Idee? :?

Muß doch wohl irgendwie möglich sein,
per callback or what ever das verdammte SysTray Icon event abzufragen sobald ich aufs Icon klicke, und nicht erst wenn die Maustaste losgelassen wird.
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Keiner Eine Idee?

♪♫ ...all we need is just a little patience... ♪♫

PS:
das "click" ereignis ist definiert durch das loslassen, so funktioniert es im komplette windows.
im endeffekt sogar erst ein wenig danach, nämlich erst, wenn die zeit fürs doppelclick-intervall abgelaufen ist und kein zweiter click erfolgte.
wieso sollte dein proggi das anders machen?

PPS:
bestimmt gibt es eine möglichkeit, auf WM_LBUTTONDOWN zu reagieren,
aber für dein problem gibt es bestimmt auch eine andere lösung mit dem klassischen LEFTCLICK.. ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag von Kai »

Kaeru Gaman hat geschrieben:> Keiner Eine Idee?

♪♫ ...all we need is just a little patience... ♪♫
Geduld? öhm ne kein Kommentar der Post is gestern gemacht,
Geduld ist nicht wirklich mein Problem sondern eher,
endlich ma ne vernünftige Lösung zu finden,
aber danke für dein ach so konstruktiven Beitrag. :|
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> der Post is gestern gemacht
gestern um 22:28, als kaum noch jemand da war, und nachgefragt heute 12:27 als noch wenige da waren.
...und 14 stunden gelten nicht als ein tag!

> Geduld ist nicht wirklich mein Problem
dann unterlass es bitte, deine topics nach weniger als 24h zu pushen.
wenn einer sein topic nach 3 tagen pusht, ok.

> aber danke für dein ach so konstruktiven Beitrag.
der ist konstruktiv, jedenfalls die beiden nachgeschriebenen absätze.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

<OT>
Kai hat geschrieben:Geduld ist nicht wirklich mein Problem sondern eher,
endlich ma ne vernünftige Lösung zu finden
wenn Du Kohle rüberrückst, können wir mal über einen zeitnahen Support nachdenken.

</OT>
a²+b²=mc²
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag von Kai »

Naja OK dann sry aber wirklich gesagt find ich es ein bisschen lächerlich das ich gleich als ungeduldig abgestempelt werde, nur weil ich schnellstmöglich eine Lösung benötige.
Manchmal ist es nun mal eilig, sry, aber da kann ich au nix für.
OK mag sein das ich dadurch eher noch weniger Hilfe bekomme aber war ganz bestimmt nicht so gemeint.
Außerdem werden ab und an Topics leicht übersehen, also ist es kein Verbrechen noch einmal nachzufragen.
Wie auch immer, ich werde es demnächst lassen, bzw ob ich hier überhaupt noch poste ist ne andere Frage, tschüß..
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

die beleidigte leberwurst zu spielen hilft auch keinem.

falls es dich noch interessiert, ich hatte mir deinen code in die IDE gepastet,
ich hab sogar extra ein icon kopiert, habs getestet und mache mir gedanken drüber,
aber wenn du jetzt lieber ne fleppe ziehn willst, dann kann ichs auch lassen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag von Kai »

Na gut also ich reich dir einfach mal die Hand und sag sry,
und nee bin nicht beleidig, na ja vielleicht war ich es kurzzeitig. :lol:

Wieder Friede? :wink:

Hab mir au was gebastelt, geht ansich schon, nur spint das ab und an noch,
und was die Msg 12502 ist weiß ich auch leider net.

Code: Alles auswählen

EnableExplicit

Procedure.s ExePath()
 Protected temp$ = Space(#MAX_PATH)
 GetModuleFileName_(0, @temp$, #MAX_PATH)
 ProcedureReturn GetPathPart(temp$)
EndProcedure

If OpenWindow(0, 0, 0, 0, 0, "", #PB_Window_Invisible)
 DisableWindow(0, 1)
Else
 End
EndIf
If OpenWindow(1, 0, 0, 200, 200, "TEST", #PB_Window_Invisible|#PB_Window_ScreenCentered|#PB_Window_SystemMenu, WindowID(0))
 StickyWindow(1, 1)
Else
 End
EndIf

Global push.l

Procedure WindowCallback(hWnd, Msg, wParam, lParam)
 Protected Result.l, title$, len.l
 Result = #PB_ProcessPureBasicEvents

 Select Msg
  
  Case 12502
   If lParam = #WM_LBUTTONDOWN
    If IsWindowVisible_(hWnd) = 1
     Debug "Hide"
     ShowWindow_(hWnd, #SW_HIDE)
    Else
     Debug "Show"
     ShowWindow_(hWnd, #SW_SHOW)
     SetForegroundWindow_(hWnd)
    EndIf
   EndIf

  Case #WM_KILLFOCUS
   If IsWindowVisible_(hWnd) = 1
    Debug "KillFocus"
    ShowWindow_(hWnd, #SW_HIDE)
   EndIf
   
 EndSelect
  
 ProcedureReturn Result
EndProcedure

Global hImg.l = LoadImage(#PB_Any, ExePath() + "icon.ico")
If hImg <> 0
 AddSysTrayIcon(0, WindowID(1), ImageID(hImg))
Else
 End
EndIf

SetWindowCallback(@WindowCallback(), 1)
Global WindowEvent.l
Repeat
 WindowEvent = WindowEvent()
 
 Select WindowEvent
  
  Case #PB_Event_CloseWindow: End
  Case #False: Delay(1)
 EndSelect
ForEver
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo, peace :wink:

hm.. also, habs mal angetestet... jetzt funktioniert es selten garnicht, ohne flackern.
aber manchmal ist die debug-meldung "killfocus" und nicht "hide"...

aus dem

Code: Alles auswählen

Global push.l
schließe ich, dass du auch auf die idee mit einem globalen flag gekommen bist?

in die richtung hatte ich auch angefangen zu überlegen, bin aber nicht wirklich weiter gekommen.

was 12502 fürn event oder msg ist, weiß ich auch nich... :|
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten