Autor Beitrag
Sockenwurm
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 20.04.09 14:22 
Folgende Procedure setzt den unsichtbaren Cursor auf Default und beendet das Programm, in diesem Fall einen Bildschirmschoner.
Angewendet wird die Procedure bei OnMouseMove.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Mausabbruch;   //Procedure zum Beenden des Savers m. Mausbewegung
begin
if Abs(cp - Mouse.CursorPos.X) > 10 then
begin
Cursor := crDefault;
Close;
end;
end;


Das funktioniert einwandfrei bei einem Monitor.
Habe ich zwei Monitore an einem Rechner wird der Cursor noch auf Default gesetzt, zum Schließen
des Programms kommt es allerdings nicht. (Cursor befindet sich auf dem Hauptmonitor, wo auch der Schoner läuft).
Vielleicht hat jemand eine Lösung.

Moderiert von user profile iconGausi: I- durch Delphi-Tags ersetzt
Sockenwurm Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 21.04.09 08:31 
Ich hab mal anstatt Close Halt eingetragen, da funktionierts auch mit 2 Monitoren.
Warum Close nicht funktioniert weiß ich allerdings nicht.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 21.04.09 08:47 
Der Unterschied dabei ist, dass Halt das Programm sofort abstürzt, deshalb ist das kein guter Weg. Wenn Close nicht funktioniert, dann muss dabei etwas schief gehen. Allerdings hat das nichts mit der Anzahl der Monitore zu tun. :gruebel:
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 21.04.09 09:44 
Ich versteh die Frage nicht..

du hast diese Prozedur in deinem eigenen Programm, dass einen Bildschirmschoner beenden soll, korrekt?
Wenn ja, was hat diese Prozedur dann in irgendeinem OnMouseMove zu suchen? MouseMove wird ausgelöst, wenn man die Maus bewegt. Und durch diese Bewegung wird doch schon der Bildschirmschoner deaktiviert.

Oder wird dieses Programm als Bildschirmschoner ausgeführt? Wenn ja, was machst du da mit dem Cursor?

Erklär die Frage nochmal.

_________________
PROGRAMMER: A device for converting coffee into software.
Sockenwurm Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 21.04.09 10:01 
Das Programm ist ein Bildschirmschoner und soll mit der Mausbewegung geschlossen werden.
Damit der Cursor nicht stört, setze ich ihn beim Start des Schoners auf unsichtbar.
Die Procedure rufe ich unter OnMouseMove auf. Wenn ich nur Close unter OnMouseMove eingebe, ist das zu
empfindlich, der Schoner bricht bei jeder Erschütterung des Tisches ab, daher die Procedure.
Der Cursor muss vor dem Schließen wieder auf Default gesetzt werden.
Die Procdure funktioniert, wie schon geschrieben nicht bei 2 Monitoren. Kann sein dass das nicht der Grund ist aber bei
einem Monitor funktioniert das.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 21.04.09 10:10 
user profile iconSockenwurm hat folgendes geschrieben Zum zitierten Posting springen:
Das Programm ist ein Bildschirmschoner und soll mit der Mausbewegung geschlossen werden.
Damit der Cursor nicht stört, setze ich ihn beim Start des Schoners auf unsichtbar.

Das beides macht Windows doch schon für dich..?!

Ich hab langsam die Befürchtung, dass du dein Programm "normal" startest, statt von Windows über Eigenschaften von Anzeige -> Bildschirmschoner.

_________________
PROGRAMMER: A device for converting coffee into software.
Sockenwurm Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 21.04.09 10:27 
Ich starte das Programm schon über Eigenschaften - Bildschirmschoner.
Windows startet dann den Schoner nach der Zeit die ich eingestellt habe.
Für den Abbruch des Schoners (z. B. durch Mausbewegung oder Tastendruck) bin aber doch ich verantwortlich.
Ich schreibe schon seit Jahren Bildschirmschoner auch mit dieser Procedure,
das hat bis jetzt immer gut funktioniert.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 21.04.09 11:03 
Hm.. ich war bisher der Meinung, dass Windows das Beenden des Bildschirmschoners übernimmt.
Nagut, kann ich nichts zu sagen, da ich bisher noch keinen eigenen gebaut habe.

Dann kann ich leider auch nicht helfen. Warum das close fehlschlagen sollte, wüsste ich nun auch nicht.
Wenn die ganze If-Abfrage nicht abgearbeitet wird, hätte ich gesagt, dass die CursorPos vielleicht ins negative wandert. Aber wenn du sagst, der Cursor wird zurückgesetzt, aber das close nicht ausgeführt - kA.

_________________
PROGRAMMER: A device for converting coffee into software.
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Di 21.04.09 12:28 
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Hm.. ich war bisher der Meinung, dass Windows das Beenden des Bildschirmschoners übernimmt.
Nagut, kann ich nichts zu sagen, da ich bisher noch keinen eigenen gebaut habe.

Er hat Recht, das muss man alles selber machen.

Warum nimmst du nicht die if-Abfrage mal raus und schließt einfach ohne. Und warum nimmst du das Schließen nicht in des Formes OnMouseMove und setzt bei der Form z. B. KeyPreview := true und schließt dann auch im OnKeyPress.
Sockenwurm Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 21.04.09 12:52 
Wenn ich nur Close unter OnMouseMove eingebe, ist das zu
empfindlich, der Schoner bricht bei jeder Erschütterung des Tisches ab, daher die Procedure,
die dann erst schließt wenn die Abweichung > 10 ist. Bei OnKeyPress geht das und das habe ich auch
so gemacht.
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Di 21.04.09 13:00 
Aha, was machst du denn da nebenbei auf dem Tisch :zwinker: .
Ich würde 3 Möglichkeiten sehen:
1. Mit Haltepunkte und Ergebnisse auswerten
2. Einfach mal testweise die Abfrage rausnehmen. Manchmal wird sowas gar nicht aufgerufen
3. Im OnMouseMove prüfen
Sockenwurm Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 21.04.09 13:13 
Das Blöde ist nur, dass ich das Ganze an einem Computer mit 1 Monitor entwickle und da funktioniert es ja.
Muss mir also mal einen 2. Monitor besorgen und dem, so wie Du beschrieben hast auf den Grund gehen.
Trotzdem Danke an alle die sich meinem Problem gewidmet haben.
SvenAbeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Di 21.04.09 14:02 
ausblenden Delphi-Quelltext
1:
if Abs(cp - Mouse.CursorPos.X) > 10 then					

Was ist denn CP?

Ausserdem prüft du nur die X-Position der Maus,
vieleicht hat dein Tester, mit den 2 Monitoren, die Maus einfach nur nach oben geschoben (Änderung in Y)?
Sockenwurm Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 21.04.09 14:16 
cp ist die X-Cursorposition die ich beim Start des Schoners abgefragt habe.
Relativ unwahrscheinlich bei einer Abweichung von 10 die Maus ganz gerade nach oben oder unten zu bewegen,
zumal ich selber an einem Computer mit 2 Monitoren getestet habe. Zur Entwicklung alledings steht mir
nur ein Computer mit 1 Monitor zur Verfügung.