In Tray starten?



  • 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.



  • Wahnsinn! Es funktioniert jetzt alles, Fokus bleibt erhalten und man kann damit arbeiten.

    Schade das es nur über diesen albernen Umweg geht.

    Grosses Dankeschön! Und vielen Dank für deine Gedult *verbeug* 👍 👍 👍



  • Gerne wieder...

    MFG


Anmelden zum Antworten