Programm in der Startleiste Anzeigen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: Programm in der Startleiste Anzeigen

BeitragSo, Apr 07, 2019 0:41
Antworten mit Zitat
Benutzer-Profile anzeigen
huhu, gibt es unter b-max eine möglichkeit sein programm dort hinzupacken wo die uhr ist von windows? ich glaub der ort nennt sich systray bin mir nicht sicher darum geb ich ein bild vom ort wo ich mein, sinn des ganzen ist es das programm im hintergrund laufen zu lassen.

warum ich das gern möchte? ich habe mir ein backup programm geschrieben was dateien von der quelle zum ziel spiegelt, damit ich halt immer ein backup habe man kann auch einstellen wie oft er es vergleichen soll.

aber so ein klobiges fenster ist halt nicht unbedingt schön ^^

das bild.
user posted image
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Holzchopf

Meisterpacker

BeitragSo, Apr 07, 2019 10:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Wird schon irgendwie möglich sein, schliesslich kann BMax ja auch C Source einbinden Wink

Wie gut ist dein Englisch? Fang mal mit diesem Artikel über Notifications and the Notification Area an. Du wirst nicht drum rum kommen, externe Funktionen zu benutzen. Was dann wiederum bedeutet, dass du mit einer Google-Suche auf anderen Programmierer-Boards zu zB C eine Lösung findest und die dann in dein BMax Programm einbindest. Könnte ein bisschen ein Gebastel werden. Im Prinzip musst du zwei Dinge können:
1. Wissen wie man Windows API Funktionen in BMax einbindet
2. Nach "windows api <dein anliegen>" googeln und dich geduldigst durch unzählige Stackoverflow Threads kämpfen, bis du mal den findest, in dem sich ein User auch dazu erbarmte, die Frage zu beantworten


Gibt schon einige Leute hier, die dir bei Punkt 1 helfen können. Also falls du dazu noch Fragen hast (ich gehe jetzt zwar irgendwie davon aus, dass du das auch schon kannst): ruhig raus damit. Aber dass mal jemand spezifisch die systray-Funktionalität behandelt hätte, daran könnte ich mich jetzt nicht mehr erinnern Rolling Eyes

mfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Mathias-Kwiatkowski

BeitragSo, Apr 07, 2019 12:48
Antworten mit Zitat
Benutzer-Profile anzeigen
ich werd mich genau um die 2 punkte mal bemühen, allerdings erst heut abend da dann die zeit ausreicht.

ich kann schon mal soviel sagen
ich glaube das punkt 1 das kleiner übel sein wird, den punkt 2 hätte was mit c zu tun und das kann ich null demnach auch kein java da es ja ähnlich sein soll, gut java steht hier so oder so ausser frage.

dennoch erst mal danke. vieleicht schaffe ich es ja falls nicht bleibt das fenster einfach wo es ist Very Happy wobei es schon ein geiles extra wäre^^...


danke für die antwort
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

count-doku

BeitragSo, Apr 07, 2019 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast Glück, und musst nach keinem der beiden Punkte von Holzchopf suchen. Ich habe genau das was du suchst schonmal in Blitz Max gemacht.

Grundsätzlich brauchst du eine C Datei, die dann die Windows API Funktionen benutzt um dein Programm in den Tray zu bringen. Danach kannst du dann ja dein Blitzmax Fenster ausblenden (mit den Standard BMax Funktionen).

Nachfolgend alle Dateien, inkl. eines kleinen Demo Programmes.
Wenn du die runterlädst und mit den jeweiligen Namen speicherst, müsstest du einen Mini Demo haben.
Genauer ein Fenster wird geöffnet und ein Tray Icon angelegt. Wenn du das Fenster mit dem [X] schließt, minimiert es sich nur in den Tray. Doppelklick auf das Tray Icon zeigt das Fenster wieder an. Rechtsklick auf das Tray Icon beendet das Programm.

Wenn du da eigene/andere Events abfangen willst musst du halt im TrayManager Callback andere Werte abfangen (dafür in der WinApi schauen). Da kannst du dann natürlich auch ein Context Menu oder ähnliches machen.

tray.c
Code: [AUSKLAPPEN]
#include "windows.h"

void __windowToTray(HWND window,int ID,const char *tip[],LPCTSTR iconFile)
{
   NOTIFYICONDATA nid;
   nid.cbSize = sizeof(NOTIFYICONDATA);
   nid.hWnd = window;
   nid.uID = 0;
   nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
   nid.uCallbackMessage = WM_USER+ID;
   nid.hIcon = LoadImage(NULL,iconFile,IMAGE_ICON,0,0,LR_LOADFROMFILE|LR_DEFAULTCOLOR);
   strcpy(nid.szTip,tip);
   Shell_NotifyIcon(NIM_ADD,&nid);
}

void __windowFromTray(HWND window,int ID,const char *tip[],LPCTSTR iconFile)
{
   NOTIFYICONDATA nid;
   nid.cbSize = sizeof(NOTIFYICONDATA);
   nid.hWnd = window;
   nid.uID = 0;
   Shell_NotifyIcon(NIM_DELETE,&nid);
}


demo.bmx
BlitzMax: [AUSKLAPPEN]
SuperStrict

Framework brl.blitz
Import brl.eventqueue
Import maxgui.win32maxguiex
Import "tray.c"

' -------------------------------------------------------------------------------------------------
' Tray Functions
Extern
Function __windowToTray:Byte Ptr(hwnd:Int, id:Int, tip:Byte Ptr, iconFile:Byte Ptr)
Function __windowFromTray(hwnd:Int, id:Int, tip:Byte Ptr, iconFile:Byte Ptr)
End Extern
Type TTrayManager
Global ids:Int[] = New Int[200]
Global trayList:TList = New TList

Field window:TGadget
Field tip:String
Field icon:String
Field func(window:TGadget, MSG:Int)
Field id:Int

Function windowToTray(window:TGadget, tip:String = "", icon:String = "", func(window:TGadget, msg:Int) = Null)
Local newTray:TTrayManager = New TTrayManager
newTray.window = window
newTray.tip = tip
newTray.icon = icon
newTray.func = func
SetWindowLongW(QueryGadget(window, QUERY_HWND), GWL_WNDPROC, Int Byte Ptr ___traysystem___Callback)
Local id:Int = 0
For Local i:Int = 0 To 199
If(TTrayManager.ids[i] = 0) Then
id = i
Exit
EndIf
Next
TTrayManager.ids[id] = 1
newTray.id = id
If(func) Then
newTray.func = func
Else
newTray.func = __traysystem__defaultfunc
EndIf
__windowToTray(QueryGadget(window, QUERY_HWND), id, tip.ToCString(), icon.ToCString())
TTrayManager.trayList.AddLast(newTray)
End Function

Function windowFromTray(window:Tgadget)
For Local tray:TTrayManager = EachIn TTrayManager.trayList
If(tray.window = window) Then
__windowFromTray(QueryGadget(tray.window, QUERY_HWND), tray.id, tray.tip.ToCString(), tray.icon.ToCString())
TTrayManager.ids[tray.id] = 0
TTrayManager.trayList.Remove(tray)
EndIf
Next
End Function
End Type
Function ___traysystem___Callback:Int(hwnd:Int, msg:Int, wparam:Int, lparam:Int) "win32"
For Local tray:TTrayManager = EachIn TTrayManager.trayList
If(msg = 1024 + tray.id) Then
' HIER KÖNNEN NATÜRLICH AUCH ANDERE EVENTS ABGEFANGEN WERDEN
If(lparam = 515) Then ' Linke Maustaste DOPPELKLICK
If(tray.func) Then tray.func(tray.window, 1)
ElseIf(lparam = 517) Then ' Rechte Maustaste DOPPELKLICK
If(tray.func) Then tray.func(tray.window, 2)
EndIf
EndIf
Next
Return TWindowsGUIDriver.ClassWndProc(hwnd, msg, wparam, lparam)
End Function
Function __traysystem__defaultfunc(window:TGadget, msg:Int)
ShowGadget(window)
TTrayManager.windowFromTray(window)
End Function
Function windowToTray(window:TGadget, tip:String = "", icon:String = "", func(window:TGadget, msg:Int) = Null)
TTrayManager.windowToTray(window, tip, icon, func)
End Function
Function windowFromTray(window:TGadget)
TTrayManager.windowFromTray(window)
End Function
' -------------------------------------------------------------------------------------------------

Global window:TGadget = CreateWindow("Tray Demo WND", 100, 100, 200, 100, Null, WINDOW_TITLEBAR | WINDOW_CLIENTCOORDS | WINDOW_RESIZABLE)
windowToTray(window, "Tray Demo", "icon.ico", trayFunc)

Repeat
WaitEvent()
Local evSource:Object = EventSource()
Select EventID()
Case EVENT_APPTERMINATE
Exit
Case EVENT_WINDOWCLOSE
HideGadget(window)
Default
' Print "EvID: " + Hex(EventID())
' Print EventData()
End Select

Forever

End

Function trayFunc(_win:TGadget, msg:Int)
If _win = window
' DIE WERTE HIER STAMMEN AUS DEM CALLBACK OBEN, KANN NATÜRLICH BELIEBIG ERWEITERT WERDEN.
If msg = 1
ShowGadget window
EnableGadget window
ElseIf msg = 2
Local ev:TEvent = CreateEvent(EVENT_APPTERMINATE)
PostEvent(ev)
End If
End If
End Function


icon.ico
user posted image


Komplett Download aller nötigen Dateien: https://www.blitzforum.de/upload/file.php?id=13386

lg,
count-doku

Mathias-Kwiatkowski

BeitragSo, Apr 07, 2019 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
echt nett von dir danke viele male!
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group