| Autor |
Beitrag |
Sockenwurm
Hält's aus hier
Beiträge: 7
|
Verfasst: 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.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Mausabbruch; 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 Gausi: I- durch Delphi-Tags ersetzt
|
|
Sockenwurm 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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. 
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 21.04.09 10:10
Sockenwurm hat folgendes geschrieben : | 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 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: Di 21.04.09 12:28
Xentar hat folgendes geschrieben : | 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 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: Di 21.04.09 13:00
Aha, was machst du denn da nebenbei auf dem Tisch  .
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 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: Di 21.04.09 14:02
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 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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.
|
|