In Tray starten?
-
Hallo.
Im WinAPI Forum konnte mir leider niemand helfen, darum eine mögliche Lösungsfrage hier.
Ich habe eine MFC Vollbild Anwendung und eine CBuilder Form.
Ich möchte im Vollbild Programm, an einer bestimmten Stelle, die CBuilder Form starten.
Mein Problem ist, das mit ShellExecute und auch CreateProcess (soweit ich mich auskenne) das CBuilder Programm immer kurzzeitig den Fokus erhält und mein Vollbild Programm sich in die Taskleiste verabschiedet. Was ich nicht möchte.
Ein Gedanke war nun das man vielleicht das CBuilder Programm beim Start sofort in die SysTray packt. Würde das den Focusdiebstahl verhindern?
Ich habe eine Skin Komponente mit der Formeigenschaft "Tray" bei WindowState, jedoch taucht das CBuilder Programm immer ganz kurz in der Taskleiste auf, bevor es in die Tray gepackt wird.
Bzw kennt wer eine andere Lösung für mein Problem?
Im Vollbild darf nichts im Hintergrund den Focus bekommen oder es minimiert sich.(DirectX Anwendung)
-
Wieso gehst du mit deiner MFC Anwendung ins VCL Forum? Gibt doch extra ein MFC Forum.
mfg cb
-
Bitte? Überhaupt den Text gelesen?
-
Hallo Reiner.
Für die BCB Form könnte folgendes funktionieren:in der Projektcpp:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { ShowWindow(Application->Handle, SW_HIDE); try { ShowWindow(Application->Handle, SW_HIDE); Application->Initialize(); Application->ShowMainForm = false; Application->CreateForm(__classid(TForm1), &Form1); ShowWindow(Application->Handle, SW_HIDE); Application->Run(); ShowWindow(Application->Handle, SW_HIDE); } catch (Exception &exception) { Application->ShowException(&exception); } ...
im OnCreateEreignis der Form:
ShowWindow(Application->Handle, SW_HIDE); DWORD dwExStyle=GetWindowLong(Application->Handle,GWL_EXSTYLE); dwExStyle |= WS_EX_TOOLWINDOW; SetWindowLong(Application->Handle,GWL_EXSTYLE,dwExStyle);
Vielleicht hilft es Dir.
Gruss
-
Das sind aber viele SW_HIDE
Das macht jetzt aber nix anderes als die Taskleiste verbergen oder?
Das Fenster geht ja wie gewohnt auf und hat damit den Fokus.
-
Die vielen SW_Hides müssen sein.
Ich habe damit schon länger herumexperimentiert und mit diesem Code funktioniert es auch zuverlässig.Bei mir hat das in Verbindung mit der TrayIconkomponente bestens geklappt. Das Fenster wird sofort im Tray sichtbar und erhält zu keiner Zeit den Focus.
Du musst dann noch die richtigen TrayIconeigenschaften setzen.Gruss
-
Willst du das??
http://www.marquardtnet.info/cecke/quickies.1/1_quicky_32.html
-
Danke euch Beiden. Welche Eigenschaften muss man denn setzen, damit es gleich in die Tray geht? Ich habe TeForm (KSDEV) Komponenten drauf und bekomme nur über TeForm1->WindowState = kwsTray in die SysTray gelegt. Leider sieht man da irgendwie das Fenster rumschwappen und verliert somit focus. In der TrayIcon1 finde ich leider nichts.
-
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.