Jump to content
loady

Dllcall does not work... partial

Recommended Posts

loady

Dear all,

I have a Windows 8 tablet hanging on the living room wall which is running permanently. There's also a precense detector in the living room, which communicates with a miniserver. If a person is in the room, it will be detected and the server triggers a programm. This is where my autoit script takes part.
If someone is in the room, a diashow (screensaver) should be shown. Otherwise, the screen should be turned off (for energie savings).

This works, so far. I can start the screensaver and I can turn off the monitor. But I cannot turn it on again. What am I doing wrong? Has anybody a clue?

According to MSDN, it should work like this: https://msdn.microsoft.com/en-us/library/windows/desktop/ms646360(v=vs.85).aspx

settings.ini

Spoiler
[Netzwerk]
IP-Adresse=192.168.132.100
IP-Port=1989

 

constants.au3

Spoiler
Global Const $listen_IP         = IniRead("einstellungen.ini", "Netzwerk", "IP-Adresse", "127.0.0.1")
Global Const $listen_PORT       = IniRead("einstellungen.ini", "Netzwerk", "IP-Adresse", "1989")
Global Const $CMD_SCREENSAVER   = "cmd_bildschirmschoner"
Global Const $CMD_MONITOR_AN    = "cmd_monitor_an"
Global Const $CMD_MONITOR_AUS   = "cmd_monitor_aus"
;~ Global Const $CMD_MOUSE_MOVE = "cmd_mouse_move"

 

miniserver.au3

Spoiler
#include "constants.au3"
#include <Constants.au3>
#NoTrayIcon

TCPStartup()

Local $ID_socket = TCPConnect($listen_IP, $listen_PORT)

If $CmdLine[0] >= 1 Then
   Switch $CmdLine[1]
   Case "-bildschirmschoner"
      TCPSend($ID_socket, $CMD_SCREENSAVER)
   Case "-an"
      TCPSend($ID_socket, $CMD_MONITOR_AN)
   Case "-aus"
      TCPSend($ID_socket, $CMD_MONITOR_AUS)
   Case Else
      MsgBox(0,"Fehler", $CmdLine[1] & " ist kein gültiger Paramter")
   EndSwitch
Else
   MsgBox(0,"Fehler", "Parameter wird zwingend gebraucht" & @CRLF & @CRLF & "Bsp.:" & @CRLF & "miniserver.exe -bildschirmschoner" & @CRLF & "miniserver.exe -an" & @CRLF & "miniserver.exe -aus")
EndIf

TCPCloseSocket($ID_socket)

 

tablet.au3

Spoiler
#include "constants.au3"
#NoTrayIcon

TCPStartup()

Local $ID_socket = TCPListen($listen_IP, $listen_PORT, 100)

While True
   Local $socket_established = -1
   Local $socket_received_data = Null

   Do
      $socket_established = TCPAccept($ID_socket)
      Sleep(100)
   Until $socket_established <> -1

   $socket_received_data = TCPRecv($socket_established, 1024)
   TCPCloseSocket($socket_established)

   _do($socket_received_data)
WEnd

Func _do($TCP_DATA)
   Switch $TCP_DATA
   Case $CMD_SCREENSAVER
      Local $result = DllCall("user32.dll", "hwnd", "GetDesktopWindow")
      DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $result[0], "uint", 0x0112, "wparam", 0xF140, "lparam", 0)
   Case $CMD_MONITOR_AN
      DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', WinGetHandle('[CLASS:Progman]'), 'int', 0x0112, 'int', 0xF170, 'int', -1)
   Case $CMD_MONITOR_AUS
      DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', WinGetHandle('[CLASS:Progman]'), 'int', 0x0112, 'int', 0xF170, 'int', 2)
   EndSwitch
EndFunc

;~ https://msdn.microsoft.com/en-us/library/windows/desktop/ms646360(v=vs.85).aspx

 

Thank you in advance

Share this post


Link to post
Share on other sites
Radiance

Does the line

   Case $CMD_MONITOR_AN

in your tablet script really get called? You can check by placing a MsgBox before or after the DLLCall.

I'm not very experienced on DLLCalls, can you maybe wake the system up alternatively by moving the mouse a little bit?

Share this post


Link to post
Share on other sites
loady

Yes, this case is called. I have already "debugged" this way.
If extended the skript by doing a MouseMove(1,1) and a Send("^")
The screen still doesn't turn on. Only if I am moving the real mouse, it works

Share this post


Link to post
Share on other sites
InunoTaishou

Weird, they both work fine for me on Windows 7. Is it an Windows 8 or Windows 10 tablet? You could try using 1 instead of 2 for the last argument to the DLLCall to put the monitor to sleep. It doesn't work on my machine but it may work on yours. 1 is sleep mode instead of power off.

Share this post


Link to post
Share on other sites
loady

yes it is a windows 8 system. I've tried this on a windows 7 machine of a friend. It worked there. It really seems to be a windows 8 issue. thanks for pointing that out

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×