In Tray starten?



  • Das mit WindowState kannst Du Dir sparen. Das macht TrayIcon für Dich. Folgende Eigenschaften im ObjectInspector setzen:

    Visible = true
    Hide = true
    

    Das war schon alles.



  • Um eine Einmischung der Skinkomponente auszuschliessen, habe ich mal eine frische Form erstellt und als einzigstes das Tray Symbol raufgepackt, ebenfalls deinen Code hinzugefügt aber nichts brachte die Form dazu bereits minimiert in der Tray zu starten. 🤡



  • Das sollte mich wundern. Habe es auch noch mal mit einer leeren Form versucht und es klappt einwandfrei. Hast Du die Eigenschaften der TrayIconkomponente richtig gesetzt? Hast Du den Quellcode vom mir mit eingefügt?

    Ich nutzte Builder 6 Enterpr



  • Habe zuerst nur mit Komponente und beides TRUE und dann zusätzlich mit deinem Code. Habe selber den BCB5 und Tray Komponente unter "Beispiele" Tab.



  • Also scheinbar hat der BCB Compilerprobleme -.-
    Nachdem ich den BorderStyle geändert habe macht er das, ebenso wenn ich es auf den alten Wert setze. Sehr witzig -.-

    Das Problem ist jetzt mein System hat Animationen an. Heisst ich sehe die Form verkleinern und vergrössern. Witzigerweise macht Tray Komponente beim vergrössern sogar die Form 2 mal auf x.X Man sieht wie das Fenster aus der Task kommt, aber es stellt sich nicht dar... dann kommt es direkt darauf nochmal aus der task und ist nun da. x.X

    Jetzt bleibt nur die Frage wie unterdrückt man die Animation für das Programm.



  • Ergänzung: In Windows kann man das über Eigenschaftend er Anzeige -> Effekte einstellen, beim ertsen Haken "Übergangseffekte". Das würde dann aber nur auf mein System zutreffen 😉

    Aber allgmein kann ich jetzt sagen das das leider nichts bringt. Das Programm bekommt beim Start für einen Bruchteil einer Sekunde den Focus und das reicht ja schon und das wars dann für die Vollbildanwendung. Schade 🙂

    Ich hasse das schon so das sich irgendwelche Programme in Vordergrund spielen. Das ist in meinen Augen sogar fast ein Bug. 🙄

    Vielen Dank für eure Hilfe!



  • Die Animation wird von Betriebssystem gesteuert. Zu finden in den Anzeigeeigenschaften. Das Problem tritt hingegen bei mir nicht auf. Deswegen nochmals die Frage: Hast Du den Code in die Unit.cpp UND in die Project.cpp an korrekter Stelle eingefügt?



  • Steht weiter oben, hatte mehrere Beiträge hintereinander 🙂
    Die EXE soll ja überall laufen, also müsste das Programm diese Animation ignorieren, aber da es mit dem Focus eh nicht klappt...

    Starte einfach mal ein solches Programm aus dem Windows Explorer. Du wirst sehen das für paar Millisekunden dieser oben in Titelzeile Grau wird und somit kurz Focus verliert.



  • Nein, das Fenster verliert nicht den Focus!

    Ich habe das sogar mit dem OnActivate-Ereignis getestet. Das durch meinen Code erzeugte Fenster bekommt zu keinem Zeitpunkt den Focus. OnActivate wird in der kompletten Laufzeit nicht einmal aufgerufen.

    Kann es sein, dass Du an irgendwelchen Stellen dem Fenster den Focus mit z.B. SetFocus übergibst?



  • Nein das ist so nicht korrekt. Die Anwendung die ShellExecute macht verliert den Focus, genauso wie der Windows Explorer wenn er die Exe startet. Das das Tray Programm OnActivate nicht erreicht ist ein ganz anderes Blatt.

    Wenn Anzeige->Effekte den haken bei Übergangseffekte aktivierst würdest es besser sehen. Ich sehe es aber bei beiden. Da Effekte nicht an hast scheinst bei deinem System es nicht zu sehen. Ist auch wirklich sehr sehr kurz wo die Titelzeile des Explorers grau wird.



  • Sorry, bei mir sind alle Effekte an. Egal, ob Einblend- oder Rolleffekt. Der Explorer verliert den Focus nicht. Und ja, bin noch unter 60 Jahre alt, meine Augen sind voll ok.

    Ich glaube eher, der Fehler liegt bei Deinem Prog. Poste am besten mal etwas Quellcode.



  • Noch ein Nachtrag.

    Bei der Anwendung, die ShellExecute aufruft müssen auch die passenden Parameter mitgegeben werden. Also nicht SW_ShowNormal o.ä. sondern SW_Hide.

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp



  • WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	ShowWindow(Application->Handle, SW_HIDE);
    	try
    	{
        	ShowWindow(Application->Handle, SW_HIDE);
    		Application->Initialize();
    		Application->CreateForm(__classid(TForm1), &Form1);
            ShowWindow(Application->Handle, SW_HIDE);
    		Application->Run();
            ShowWindow(Application->Handle, SW_HIDE);
    	}
    	catch (Exception &exception)
    	{
    		Application->ShowException(&exception);
    	}
    	return 0;
    }
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    ShowWindow(Application->Handle, SW_HIDE);
    DWORD dwExStyle=GetWindowLong(Application->Handle,GWL_EXSTYLE);
    dwExStyle |= WS_EX_TOOLWINDOW;
    SetWindowLong(Application->Handle,GWL_EXSTYLE,dwExStyle);
    }
    

    TrayIcon1->Hide = true;
    TrayIcon1->Visible = true;

    🙄



  • In Deinem Code steht nicht

    Application->ShowMainForm = false;
    

    Schau mal nochmal zu den von mir geposteten Code.

    Hier noch ein Link:
    http://www.bytesandmore.de/rad/index.htm?http://www.bytesandmore.de/rad/cpp/snipp/sc06024.php

    Gruss



  • Oh 😮, sowas auch 🙄 .. tschuldigung 🤡

    Stimmt, scheinbar verliert er nun nicht mehr den Focus beim start. aber wie bekomme ich das Programm wieder aus der Task?

    void __fastcall TForm1::TrayIcon1Click(TObject *Sender)
    {
    Application->ShowMainForm = true;
    }
    

    ..machts leider nicht. Ich kann den Task auch nur noch mit den Taskmanager beenden.



  • Hallo Reiner.

    Du musst ein PopupMenu in die TrayIconkomponente einbinden. Damit kannst Du dann z.B. eine Ereignisbehandlungsroutine für "Beenden" schreiben.



  • Danke. Aber sichtbar bekommt man die Form nicht mehr?



  • Doch schon. Aber dann bekommt die Form den Focus.

    Zum sichtbar machen:

    Application->ShowMainForm = true;
    ShowWindow(Application->Handle, SW_SHOW);
    Application->ProcessMessages();
    


  • TrayIcon1->PopupMenu = PopupMenu1;
    TrayIcon1->PopupMenuOn = imClick;
    TrayIcon1->RestoreOn = imClick
    TrayIcon1->OnClick = RestoreClick;

    // header
    TPopupMenu *PopupMenu1;
    TMenuItem *Restore;
    
    // cpp
    void __fastcall TForm1::RestoreClick(TObject *Sender)
    {
    	Application->ShowMainForm = true;
    	ShowWindow(Application->Handle, SW_SHOW);
    	Application->ProcessMessages();
    }
    

    Aber ich bekomme weder ein Popup noch es wieder gross 😞
    Den Focus darf es nur nicht beim Starten verlieren, wenn ein Benutzer damit arbeiten will ist es ok.



  • Hallo

    Was noch gefehlt hat, war, dass die Form auch noch mit Show() gezeigt werden muss.

    void __fastcall TForm1::Zeigen1Click(TObject *Sender)
    {
         // Form wird wieder hergestellt
         // Item des PopupMenus
         Application->ShowMainForm = true;
         ShowWindow(Application->Handle, SW_SHOW);
         Form1->Show();
         Application->ProcessMessages();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::TrayIcon1Click(TObject *Sender)
    {
         // PopupMenu zeigen
         POINT test;
         GetCursorPos(&test);
         PopupMenu1->Popup(test.x, test.y);
    }
    

    Du kannst auch das OnMouseUp-Ereignis nehmen, um zu prüfen, ob linle oder rechte Maustaste gedrückt wurde.


Anmelden zum Antworten