![]() |
Fenster sichtbar machen
Ein Programm soll periodisch eine Webcam überwachen, und damit das funktioniert, muss das entsprechende Fenster im Vordergrund sichtbar sein (Das Programm läuft auf einem File Server, auf dem normalerweise nicht gearbeitet wird, also stört das nicht wirklich).
Solange man das Programm laufen lässt und nichts anrührt, funktioniert alles wunderbar, aber wenn jemand das Programmfenster (irrtümlich) minimiert, geht nichts mehr. Deshalb wollte ich zu Beginn jedes Zyklus vor dem Auslesen der Kamera per
Delphi-Quellcode:
sicherstellen, dass das Fenster nicht minimiert ist. Bloß kümmert sich das Fenster nicht im geringsten um diese Anweisung. Wenn es minimiert war, dann bleibt das so. Was muss man noch machen, um zu erreichen, dass ein minimiertes Programmfenster (das Hauptformular der Anwendung) wieder im Zustand wsnormal angezeigt wird?
windowstate:=wsnormal;
|
AW: Fenster sichtbar machen
Guck mal hier. Ich mache das immer hiermit. Funktioniert von Windows XP bis Windows 10.
![]() |
AW: Fenster sichtbar machen
Danke, gleich ausprobiert, leider hilft mir das auch nicht weiter. Diese Funktionen bringen das Fenster in den Vordergrund, wenn es vorher nicht minimiert im Hintergrund war. Aber wenn das Fenster minimiert ist, bleibt es minimiert.
|
AW: Fenster sichtbar machen
Zitat:
Also sobald jemand das Fenster minimieren will setze es auf Hide. und auf visible wenn du es in den Vordergrund bringen willst. gruss |
AW: Fenster sichtbar machen
Ich vermute mal, dass du die ganzen Überwachungsaktionen im Main Thread machst. Dadurch ist deine Anwendung wahrscheinlich so ausgelastet, dass keine Zeit mehr für das Zeichnen der Form bzw. zum Verarbeiten von Messages bleibt. Unschöne Abhilfe könnte ein
Delphi-Quellcode:
nach einer bestimmten Anzahl von Zeichendurchläufen bringen.
Application.ProcessMessages;
Besser wäre es aber, wenn du die Webcam in einem anderen Thread abfrägst und die Daten dort verarbeitest. Dann bleibt auch dein Programm bedienbar. |
AW: Fenster sichtbar machen
Zitat:
Beim Ändern der Größe würde wahrscheinlich das Gleiche passieren. Bei Systemen vor Vista (mit DWM) würde das Fenster vermutlich weiß bleiben und sich gar nicht mehr neuzeichnen wenn ein anderes Fenster drübergelegt wird. |
AW: Fenster sichtbar machen
Davon ab ist es unmöglich ein Fenster in den Vordergrund zu bringen wenn es minimiert ist.
Deshalb habe ich gesagt er soll dafür sorge tragen das es nicht minimiert wird. Wie oder in welcher weise er sein Fenster zeichnet ist erst mal nebensächlich. Zitat:
Zitat:
Bin mir jetzt nicht sicher wie oder wo du windowstate:=wsnormal; setzt. EDIT: Glaube aber das deine Anwendung wenn sie keinen Focus hat damit nichts erreichen wird. Versuche es einfach mal auf die alt bewährte weise mit ShowWindow und sorge dafür das sie einen Focus hat was im minimierten zustand schwerlich zu erreichen ist wenn du keine Callback oder ähnliches dafür eigerichtet hast. gruss |
AW: Fenster sichtbar machen
Zitat:
Wenn er das Fenster nicht erneut aus der Taskleiste bekommt nachdem es minimiert wurde, ist doch wohl eindeutig der Hauptthread total mit Müll blockiert. |
AW: Fenster sichtbar machen
Zitat:
Möchte ich das bezweifeln. Aber egal ohne Antwort von ihm werden wir das wohl nicht erfahren. Daher ist es nur reine Spekulation. Zitat:
Es scheint mir so als wenn ihr nicht lest was hier geschrieben wird. gruss |
AW: Fenster sichtbar machen
Zitat:
Zitat:
Delphi-Quellcode:
erreicht werden, oder?
windowstate:=wsnormal;
|
AW: Fenster sichtbar machen
Zitat:
|
AW: Fenster sichtbar machen
Ich kann über eine URL direkt ein JPG von der Kamera abrufen. Das jpg wird dann in einer TWebBrowser Komponente angezeigt. Damit das funktioniert, muss das Formular mit dem TWebbrowser im Vordergrund sichtbar sein.
|
AW: Fenster sichtbar machen
Und warum holst du es dir nicht über eine HTTP-Komponente und einem Download direkt in dein Programm?
|
AW: Fenster sichtbar machen
Zitat:
Zitat:
Frage? Wenn du eine Taste für deine Anwendung registrierst und dann versuchst mit dieser deine Anwendung wieder zu maximieren was passiert wenn diese keinen Focus hat? Gar nichts! Lösung! Das bedeutet du benötigst eine Callback (oder einen Hook) von einer externen Anwendung DLL oder was auch immer die den Status deiner Anwendung überprüft. Diese sendet dann ein ShowWindow wenn diese Minimiert wurde und das war's dann schon. Deine Anwendung selbst kann das nicht. Zitat:
Das kannst du dann weder resizen noch Minimieren. Aber letztendlich wirst du über einen Hook nicht drum rum kommen da du ja auch den Vordergrund Status prüfen musst. gruss |
AW: Fenster sichtbar machen
Zitat:
Zitat:
![]() Wie mache ich aus einer normalen Form ein nicht minimierbares Fenster? |
AW: Fenster sichtbar machen
Tja, und mittlerweile ist es durch das hausgemachte Problem mit der Screenshotkrücke wohl erheblich teurer geworden und funktioniert nicht zuverlässig. Und der Download mit einer HTTP-Komponente ist auch nicht viel komplexer. Eher wahrscheinlich das Gegenteil und zudem dürfte es zuverlässiger funktionieren.
Link: ![]() Copy and paste und schon fast fertig. Inklusive Anpassung für den Kunden 2 oder 3 Stunden. |
AW: Fenster sichtbar machen
Du schreibst du holst alle paar Minuten ein Bild und dann wird ein Timer aktiviert.
Aber dieses "alle paar Minuten"... ist das nicht auch ein Timer? Oder noch schlimmer. Ein Sleep? Mit "Ausgelastet" meinte ich keine 100% Auslastung sondern einfach nur, dass der Hauptthread blockiert wird. |
AW: Fenster sichtbar machen
Liste der Anhänge anzeigen (Anzahl: 1)
Mit XE7, WIN8.1 geht folgender Test-Code:
Delphi-Quellcode:
Source + EXE hinzugefügt
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; Button1: TButton; procedure Timer1Timer(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure SetCursorToControl(Control: TControl); var P: TPoint; begin P.X := Control.Width div 2; P.Y := Control.Height div 2; P := Control.ClientToScreen(P); SetCursorPos(P.X, P.Y); end; procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled:= TRUE; Button1.Enabled:= FALSE; Self.WindowState:= wsMinimized; end; procedure TForm1.Timer1Timer(Sender: TObject); // interval:= 10000; begin Timer1.Enabled:= FALSE; Button1.Enabled:= TRUE; Application.BringToFront; //Setzt das zuletzt aktive Fenster auf dem Desktop in den Vordergrund Self.WindowState:= wsNormal; // besser als: Application.Restore; SetCursorToControl(self); mouse_event(MOUSEEVENTF_LEFTDOWN, 50, 50, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 50, 50, 0, 0); end; end. |
AW: Fenster sichtbar machen
Zitat:
Und das "hausgemachte" Problem war zu Beginn überhaupt nicht absehbar. Von einer normalen Form kann ich jederzeit eine Kopie eines Teils des Canvas machen, auch wenn die Form gerade nicht am Bildschirm sichtbar ist. Alle Schwierigkeiten haben damit begonnen, dass das in diesem Fall nicht funktioniert. Das konnte ich im voraus nicht wissen. |
AW: Fenster sichtbar machen
Zitat:
gruss |
AW: Fenster sichtbar machen
Zitat:
Zitat:
Zitat:
Zitat:
Leider lässt sich dein Projekt mit meinem Delphi 2009 nicht kompilieren, ich bekomme die Fehlermeldung
Code:
Funktioniert das Restore des Fensters in denem Beispielprogramm immer noch, wenn du in der Button1Click Routine die Zeile
[MSBuild Fehler] 0 ist ein ungültiger Wert für den DebugInformation-Parameter der DCC-Aufgabe. Der DebugInformation-Parameter gehört zum System.Boolean-Typ.
Delphi-Quellcode:
herausnimmst und statt dessen nach dem Klick auf den Button das Fenster manuell minimierst?
Self.WindowState:= wsMinimized;
|
AW: Fenster sichtbar machen
Zitat:
Hinweis: Der mouse_event darf NICHT über dem Element erfolgen (im Beispiel Button1), das den Test ausgelöst hat, weil sonst gleich ein neuer Test ausgelöst wird (Kettenreaktion). Evtl. mouse_event-Parameter ändern oder Button1 verschieben. Wegen Debugger: Starte die Compilation versuchsweise mal mit Umsch+Strg+F9. |
AW: Fenster sichtbar machen
Zitat:
Zitat:
|
AW: Fenster sichtbar machen
Ich würde es immer noch direkt über HTTP probierten. Jetzt hast du so viel Zeit vergagelt... ;)
|
AW: Fenster sichtbar machen
Es wird ja wohl ein Image im Browser angezeigt. Man müsste also die Seite mach dem img-Tag scuhen können. Oder im JS-Script sehen, wo die Images abgelegt werden. FTP wäre noch eine Idee.
|
AW: Fenster sichtbar machen
Oder gibt es für die Kamera keine API?
|
AW: Fenster sichtbar machen
Es gibt für die Kamera keine dokumentierte API, zumindest habe ich im Internet nichts gefunden, und auch keinen dokumentierten FTP-Zugang. Es läuft ein Javascript, das habe ich mir angeschaut, aber bin daraus nicht schlau geworden. Deshalb diese Lösung, mit der ich auch nicht besonders viel "Zeit vergagelt" habe, jedenfalls nicht mehr als mit einer anderen Lösung, bei der ich möglicherweise die Hindernisse auch erst unterwegs bemerkt hätte.
Das Programm ist längst fertig und läuft seit gut einem halben Jahr einwandfrei, von "funktioniert nicht zuverlässig" kann keine Rede sein. Es ist aber jetzt zum zweiten Mal passiert, dass ein Mitarbeiter das Programm irrtümlich minimiert hat. Die Möglichkeit habe ich jetzt mit Forumsunterstützung abgestellt (schöner wärs andersrum, wenn das Programm selbstständig wieder hervorkommen würde, aber das ist nicht wirklich wichtig), und dazu habe ich dem Fenster während des Auslesens des Bildes noch die Eigenschaft stayontop verpasst. An dem Server wird normalerweise nicht gearbeitet, aber es laufen darauf ein paar "Hintergrundprogramme", die ganz sporadisch einen kurzen Bedienereingriff erfordern. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz