Bildschirmschoner beenden über Script

  • Hallo, ich hatte gestern schon auf einen alten Thread geantwortet, bin darauf hingewiesen worden, nen neuen aufzumachen.

    Also folgende Geschichte: Ich möchte von einer Mediensteuerung (Crestron) aus bei einem Win 8 Rechner den Bildschirmschoner beenden über ein Script. Nun kam die Antwort, daß ich das doch mit Mausbewegung machen soll. Nun ist es aber so, daß die Mausbewegung tatsächlich verhindern kann, daß der Bildschirmschoner überhaupt angeht, wenn der Bildschirmschoner aber aktiv ist, hilft weder eine virtuelle Mausbewegung noch eine virtuelle Keyboardeingabe, der Bildschirmschoner muss offensichtlich durch eine hardwareseitig verbundene Maus oder Tastatur wieder beendet werden. Nach längerer Recherche im www habe ich herausgefunden, daß man wohl den Screensaver-Prozess beenden muss, damit die Sache funktionieren kann. Da ich aber beim Mediensteuerungs-Programmieren relativ fit bin, aber bezüglich Scripting praktisch noch nie was gemacht habe, bräuchte ich da etwas Hilfe.

    Mit den Beispielen aus der Hilfe habe ich zumindest schon die Verbindung an den Start bekommen. Allerdings verstehe ich da noch manches nicht so ganz. Vielleicht kann mir da jemand weiterhelfen.

    Func ScreensaverOFF()
    TCPStartup() ; Start the TCP service.

    ; Register OnAutoItExit to be called when the script is closed.
    OnAutoItExitRegister("OnAutoItExit")

    ; Assign Local variables the loopback IP Address and the Port.
    Local $sIPAddress = "192.168.8.102" ; This IP Address only works for testing on your own computer.
    Local $iPort = 61555 ; Port used for the connection.

    Local $iListenSocket = TCPListen($sIPAddress, $iPort, 100)
    Local $iError = 0

    ;Local $sReceived = TCPRecv($iSocket, 1024)

    If @error Then
    ; Someone is probably already listening on this IP Address and Port (script already running?).
    $iError = @error
    MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Server:" & @CRLF & "Could not listen, Error code: " & $iError)
    Return False
    EndIf

    ; Assign a Local variable to be used by the Client socket.
    Local $iSocket = 0

    Do ; Wait for someone to connect (Unlimited).
    ; Accept incomming connexions if present (Socket to close when finished; one socket per client).
    $iSocket = TCPAccept($iListenSocket)

    ; If an error occurred display the error code and return False.
    If @error Then
    $iError = @error
    MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Server:" & @CRLF & "Could not accept the incoming connection, Error code: " & $iError)
    Return False
    EndIf

    If GUIGetMsg() = $GUI_EVENT_CLOSE Then Return False

    Local $sReceived = TCPRecv($iSocket, 14)
    IF $sReceived="ScreensaverOFF" Then
    If ProcessExists("scrnsave.scr") Then ; Check if the Screensaver process is running.
    ProcessClose("scrnsave.scr")
    Else
    MsgBox($MB_SYSTEMMODAL, "", "Screensaver is not running")
    EndIf
    EndIf


    Until $iSocket <> -1 ;if different from -1 a client is connected.
    ; Assign a Local variable the data received.

    ; Notes: If you don't know how much length will be the data,
    $arMPos=MouseGetPos()
    ;Maus bewegen um 10 Pixel nach unten rechts
    MouseMove($arMPos[0]+10,$arMPos[1]+10,1)
    ;Falls die Maus unten rechts war konnte sie nicht bewegt werden, bewegen wir sie nach oben links
    MouseMove($arMPos[0]-10,$arMPos[1]-10,1)
    ;Maus zurücksetzen
    MouseMove($arMPos[0],$arMPos[1],1)

    ; Close the Listening socket to allow afterward binds.
    TCPCloseSocket($iListenSocket)

    EndFunc ;==>ScreensaverOFF


    Func OnAutoItExit()
    TCPShutdown() ; Close the TCP service.
    EndFunc ;==>OnAutoItExit


    So wie es jetzt ist, funktioniert es mit der Mausgeschichte, ich öffne einfach eine TCP Verbindung und schon wird die Maus verschoben. Wie gesagt, hilft das allerdings nicht zur Beendigung des Screensavers. Dann habe ich im Do-Until Bereich eine Abfrage drin, die erkennen soll, was geschickt wurde, das fände ich ehrlich gesagt eleganter. Ich hatte testhalber auch schon ne Messagebox eingebaut, die mir die Sache auch ausgegeben hat, allerdings sehr unzuverlässig und natürlich habe ich momentan keine dauerhafte Überprüfung der Schnittstelle, nach einer Verbindung ist Schluß. Aber das ist ja dann zweitrangig und vermutlich eher kein Problem.

    Kann mir jemand weiterhelfen?

  • Code am besten in den ScriptTag packen, mit Sprache Autoit (</> oben in der Leiste beim Text verfassen.).
    Hab herausgefunden, dass der Screensaver unterbrochen wird, wenn ein neues Fenster erscheint. Also erstell ich eins, lass es kurz anzeigen und lösch es dann direkt wieder. Bisher hab ichs dabei noch nicht gesehen :D (Windows 7)
    (Wollte mir die Prozesse auflisten, als das _arraydisplay-Fenster kam, war der Bildschirmschoner unterbrochen :))

    Server-Script:


    Client Script:

    Ich habe übrigens UDP verwendet, da TCP eher darauf ausgelegt ist, größere Datenmengen zu verschicken, oder beständig Daten hinundherzuschieben. Um nur einmal kurz den Anstoß zu geben, dass er was bestimmtes machen soll, sollte man UDP nutzen. Oder Allgemein, wenn man nur eben eine Anfrage hat,...

    Mit freundlichen Grüßen, Kanashius :)

  • Hallo Kanashius,

    bei mir funktioniert das nicht auf nem Win8.1 Rechner.
    Die Connection funktioniert, der Befehl wird auch empfangen, aber der Screensaver bleibt.
    Um zu testen, ob der Befehl ankommt, habe ich einfach eine Message-Box eingefügt:


    AutoIt
    Func _interruptScreensaver()
    	$handle=WinGetHandle("[active]")
    	$tmpGui=GUICreate("")
    	GUIDelete($tmpGui)
    	WinActivate($handle)
    	MsgBox($MB_SYSTEMMODAL, "", "Command received")
    EndFunc

    Scheinbar ist da ein Unterschied zwischen Win7 und Win8.1. Ich habe eine Mediensteuerung amStart, von der aus ich die UDP oder TCP-Befehle verschicken kann.

    Der Grund, warum ich mit TCP arbeiten möchte, ist, daß ich hierbei mit der Mediensteuerung über den TCP-Connect einfach testen kann, ob der Rechner überhaupt da ist/hört.

  • AutoIt
    Func _interruptScreensaver()
    	$handle=WinGetHandle("[active]")
    	$tmpGui=GUICreate("")
    	GUIDelete($tmpGui)
    	WinActivate($handle)
    	ProcessClose("scrnsave.scr")
    	;MsgBox($MB_SYSTEMMODAL, "", "Command received")
    EndFunc

    Das ist jetzt die Lösung des Problems. Der Prozess scrnsave.scr muss beendet werden.