Programm bei Mausbewegung sofort beenden

  • Ich brauche mal wieder eine Idee.
    Um den Energiesparmodus / Bildschirmschoner zu verhindern lasse ich regelmäßig die Maus bewegen.
    Dazu dient das folgende 2 Minuten Programm:

    Einfach per F5 starten, wenn keine Parameter übergeben werden nimmt es Default-Werte. Ihr seht den Mauszeiger bewegen.

    Ich habe das Programm kompiliert also .exe im gleichen Pfad wie mein Hauptprogramm liegen.
    Das Hauptprogramm nutzt die Funktion _Timer_GetIdleTime() aus und startet ggf. per ShellExecute das obige Programm.

    Damit meine Anwender sehen das was passiert bewege ich den Mauszeiger 100x100 Pixel im Quadrat.
    Soweit, so gut.

    Nun hätte ich gerne das sobald man die echte/reale Maus bewegt sich das Programm sofort beendet.

    Blöd ist halt das wir ja den Mauszeiger gerade selbst bewegen ... ich hab es mal in einer Schleife mit Einzelschritten probiert ...
    Ist natürlich ruckelig ... aber was Frage ich ab? Die Maus bewegt ja gerade das Programm ...
    Ich könnte versuche eine Abweichung vom geplanten Pfad zu finden ... klingt aber nach Glückssache.

    BLinz

  • Ich saß vor einiger Zeit an einem Projekt um die Eingaben von unterschiedlichen Geräten zu unterscheiden.
    Anfänglich hatte ich es mit der RawInput.au3 geplant, mit der konnte ich für Tastatureingaben (und ich schätze auch für die Maus) das Eingabegerät anzeigen lassen.

    Bei, von AutoIt gesendeten, Keystokres hat sich der Device Identifier geändert. Ich schätze, dass das selbe auch für die Maus möglich ist.
    Auch wenn es anfänglich verwirrend und kompliziert erscheinen mag, schau dir mal die RawInput.au3 und ein paar Beispiele aus dem engl. Forum an.

    • Offizieller Beitrag

    Wenn Du verhindern willst, dass der Bildschirmschoner "zuschlägt", warum deaktivierst Du ihn dann nicht?
    Einfach in der Registry den Zeitwert auf Null setzen:

  • Wenn Du verhindern willst, dass der Bildschirmschoner "zuschlägt", warum deaktivierst Du ihn dann nicht?

    Weil der Benutzer das nicht darf 8|

    Ist per Gruppenrichtlinie gesetzt, die Programme laufen alle nur mit den Rechten eines normalen Benutzers - und darf fast gar nichts (außer ein paar lokale Programme zu starten oder eine Citrix-Sitzung zu starten)

    Das ist jetzt kein dramatisches Problem ... ich würde es nur cool finden es gelöst zu haben.

    Ich bin in der Hilfe auf _WinAPI_RegisterRawInputDevices gestoßen - im Beispiel wird auf die Mausdaten zugegriffen.
    Leider reagiert das Programm auch bei MouseMove ... AutoIt ist einfach zu gut :thumbup:

  • Ich bin in der Hilfe auf _WinAPI_RegisterRawInputDevices gestoßen - im Beispiel wird auf die Mausdaten zugegriffen.
    Leider reagiert das Programm auch bei MouseMove ... AutoIt ist einfach zu gut

    LOL ... ausgerechnet die Mauskoordinaten werden mit der normalen AutoIt Function ausgelesen, den ganzen Rest holen holen die woanders her.

    • Offizieller Beitrag

    Wenn das unbedingt mit den Mausbewegungen sein soll, dann bewege die Maus immer nur einen Schritt und sieh nach, ob die Maus sich danach wirklich dort befindet.
    Wenn nicht, dann hat der Benutzer die Maus zusätzlich bewegt und das Programm kann beendet werden:

  • Hallo @BLinz,
    Oscars Vorschlag sticht sicher. Aber ich frage mich, ob du nicht einfach statt per Mausbewegung in Schleife eine Taste drücken kannst (F2 oder eine der diversen Funktions-/Sondertasten auf die bei dir nichts reagiert). Dann wäre die Mausbewegung als Identifikation wieder eindeutig.


    EDIT: Ist mir eben noch aufgegangen. Man erstellt für dieses Programm eine GUI außerhalb des Bildbereichs oder nicht sichtbar und sendet mit ControlSend an das Fenster. Dann geht auch Up oder Down und man hat sicher keine negativen Effekte.

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (2. Juni 2017 um 08:37)

  • Hallo @BLinz,
    Oscars Vorschlag sticht sicher. Aber ich frage mich, ob du nicht einfach statt per Mausbewegung in Schleife eine Taste drücken kannst (F2 oder eine der diversen Funktions-/Sondertasten auf die bei dir nichts reagiert). Dann wäre die Mausbewegung als Identifikation wieder eindeutig.


    Das halte ich auch für eine bessere Lösung. Ich würde als Tasten entweder Scroll-Lock oder Pause vorschlagen.

  • Ich bin mal so frei und werfe meine Gedanken mit in den Raum.

    Wenn Benutzer eingeschränkte Berechtigungen haben, hat das (meist) einen Grund.
    Berechtigungen können sinnvoll via GPOs oder Gruppen geregelt werden. Vielleicht magst du ja mal ausschmücken, was die Ursache dafür ist, das einschalten des Bildschirmschoners zu verhindern.

    Angenommen es nervt dich, dass du jedes mal ein Kennwort zur Entsperrung eingeben musst.
    Da macht dein Arbeitgeber alles richtig. Es ist wichtig seinen Arbeitsplatz sicher zu halten.
    Wenn es andere gründe gibt, z.B. eine starke Beeinträchtigung in deinen Arbeitsabläufen, da glaube ich kaum, dass dein Vorgesetzer sagen wird "Es bleibt hier alles so wie es ist! :cursing: ".
    Wenn es dich und andere Kollegen betrifft, kann man euch als Abteilung ggf. eine Berechtigung mehr geben, oder halt die Einstellung anders setzen (deaktivieren/höher setzen).

    Wenn dein Programm sich beenden soll, sobald der Mauszeiger "wirklich" bewegt wird, musst du das Programm ja auch jedes mal starten, sobald du "AFK" gehst. Wie ich finde, keine schöne Lösung.

    PS: "Und das Kinderzimmer bleibt auch so wie es ist! :cursing: ".

    Grüße Yaerox

    Grüne Hölle

    • Offizieller Beitrag

    und sendet mit ControlSend an das Fenster

    Bist Du sicher, das ein ControlSend das einschalten des Bildschirmschoners verhindert?
    Generell würde ich keine Tasten-Emulation verwenden, denn wenn der Anwender gerade einen Editor oder so benutzt und einen Text eingeben will, dann kommst Du ihm damit ins Gehege.
    Eine Maus-Bewegung hingegen ist weniger kritisch.

  • Bist Du sicher, das ein ControlSend das einschalten des Bildschirmschoners verhindert?

    Nein, @Oscar. Ich weiß es nicht und habe weder ControlSend noch Send getestet und müsste es bei Bedarf selbst erst ausprobieren.
    Für sehr kritisch halte ich Tastendruck-Emulation in diesem Fall zwar eigentlich nicht (es geht ja nicht um eine allgemeine Lösung, sondern auf eine spezielle für eine Umgebung). Aber stimmt, es ist immer besser gar keine programmsteuernde Eingabe vorzunehmen. Deine Lösung wäre für mich auch eindeutig genug.

    Grüße autoiter

  • So, ich spare mir mal das einzelne Zitieren und antworte pauschal:

    Gruppenrichtlinien:
    Na klar hat das seinen Grund, alle Einwände von euch sind berechtigt. Moralisch bin ich da ganz bei euch.
    Aber ...
    Ich nutze das bei einem Kunden mit ca. 4.000 Arbeitsplätzen weltweit. Die Rechner sind alle gleich, alle haben unter anderem diese Richtlinie für den Bildschirmschoner und sogar ein Firmeneigenes Energieprofil.
    Und in diesem Netzwerk verteilt sind nun 12 Test-Arbeitsplätze auf denen automatisiert Performancetest verschiedener Anwendungen durchgeführt werden (Diverse Branchensoftware / Sharepoint usw).
    Diese Rechner stehen da irgendwo ohne Maus, Tastatur und Bildschirm - hoffentlich sicher verschlossen.

    Selbstverständlich sind das die gleichen Rechner mit den gleichen Richtlinien wie alle anderen - das soll ja auch so damit das Ergebnis realistischer ist. Die bekommen die selben Updates und Programme per Softwareverteilung wie alle anderen. Ausnahme ist eine zusätzliche Richtlinie welche eine automatische Anmeldung ausführt und das Testprogramm startet (prüfe gerade das als Dienst zu realisieren)

    Die Lösung für dieses "Problem" such ich nur ... weil ich wissen will ob es machbar ist.
    Und weil sich der Mauszeiger natürlich immer dann gerade bewegt wenn ich gerade was mit der Maus an dem einen Testrechner machen will der bei mir am Schreibtisch steht.

    ControlSend
    Muss ich noch testen aber ich meine das wird ignoriert - sprich das reicht nicht. Teste ich aber Dienstag noch mal. Aber siehe auch nächsten Abschnitt.

    Taste statt Mauszeiger:
    Müsste ich testen ... aber das ist gar nicht mein Problem. Wie man oben im Code sehen kann, kann man auch die Zeit 0 übergeben. Das schiebt er die Maus einen Pixel hin und her. Das reicht völlig und keiner merkt im Normalfall etwas.

    Die Maus bewege ich unter anderem so "großzügig" damit man es sieht. Mein lokaler Testrechner läuft den ganzen Tag mit einem eigenen Bildschirm hier. Alle Naselang kommt einer aus den Fachabteilung und schaut wie weit ich bin. Weshalb mein ganzes Testprogramm auf dem Bildschirm die ganze Zeit blitzt, blinkt und funkelt wie ein Rapper mit Goldketten und LED-Armbänder in weißen Shorts in einer Disco mit Schwarzlicht und Lasershow.
    Am liebsten würde ich das auch noch eine farbige Mausspur hinterziehen lassen die dann verblasst.

    Gruß,
    BLinz


    PS: Ich forsche gerade an dem hier: 2 Mauszeiger ... gibt es irgendwo einen Leitfaden wie das mit den ganzen DllStruct etc. genau funktioniert? Sprich wie ich mir das selbst anhand einer Information X herleite?

  • Hab grad den Überblick verloren. Hat schon jemand ein Hotkey zum beenden vorgeschlagen?


    Update:

    Den Ablauf mit der Mausposition würde ich mir logisch so vorstellen:

    Deine Rap-Effekte kann man da natürlich noch überall einbauen ;):thumbup:

    Grüße Yaerox

    Grüne Hölle

    2 Mal editiert, zuletzt von Yaerox (2. Juni 2017 um 11:09)

  • So, hier nun eine funktionierende Version.
    Sieht unter Windows 10 auch schön flüssig aus (unter Windows 7 je nach Rechner mal smooth, mal ruckelig)

    Die Idee hatte ich schon vorher, hatte aber unnötige Sorgen wegen des Overkills an MausPosition Abfragen.


    Ich setz das Thema mal auf gelöst ... auch wenn der "rote Zauberschweif" des Mauszeigers noch fehlt ... (wie mache ich eigentlich einen Kreis ....)

  • Hast Du mein Script aus Post#6 mal ausprobiert.
    Das funktioniert nämlich viel einfacher. ^^

    Jepp, um einiges eleganter ... :Face: und funktioniert genauso gut.

    Wenn ich jetzt noch den roten Zauberschweif bekommen nehme ich dein statt mein Script :D

    • Offizieller Beitrag

    Wenn ich jetzt noch den roten Zauberschweif bekommen nehme ich dein statt mein Script

    Für Zauberschweif ist UEZ (GDI+ Meister) zuständig. :D
    Von mir kannst Du einen "WanderingBug" bekommen: