In Tray starten?
-
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.
-
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.phpGruss
-
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