Monitor abschalten über Dienst

  • VB.NET

Es gibt 42 Antworten in diesem Thema. Der letzte Beitrag () ist von haufe.

    Na hoffen wir mal das es damit geht =)

    Also das mein Code und denke von haufe wird der ähnlich aussehen und so funktioniert es nicht

    VB.NET-Quellcode

    1. Public Class Service1
    2. Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal Msg As Long, ByVal wParam As Object, ByVal lParam As Object) As Long
    3. Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hwndParent As IntPtr, ByVal hwndChildAfter As IntPtr, ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr
    4. Protected Overrides Sub OnStart(ByVal args() As String)
    5. ' Code zum Starten des Dienstes hier einfügen. Diese Methode sollte Vorgänge
    6. ' ausführen, damit der Dienst gestartet werden kann.
    7. Dim hwnd As IntPtr = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", Nothing)
    8. SendMessage(hwnd, &H112, &HF170, 2)
    9. End Sub
    10. Protected Overrides Sub OnStop()
    11. ' Hier Code zum Ausführen erforderlicher Löschvorgänge zum Beenden des Dienstes einfügen.
    12. End Sub
    13. End Class
    Nabend

    Ja, das von Dodo habe ich auch so ähnlich, nur mache ich meinen Aufruf per Telnet in einer Sub.

    Und so bekommt man kein Handel
    ähh? wasn das :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „haufe“ ()

    Ja, mit deinem Aufruf bräuchte ich kein Handle mehr, aber funktionieren tuts auch nicht.....
    Ob Findwindow oder Sendmessage, alles beide geht in einem Service nicht

    So hab mir gedacht ich mache eine Konsolenanwendung und hau es da rein, jetzt wollte ich sie über meinen Dienst starten............... Erkennung interaktive Dienste und wieder nix.

    Mache ich beim Start, no window, auch nix ahhhhhhhhhhhhh Scheiss Win 7
    ähh? wasn das :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „haufe“ ()

    Man man man...muss der Profi wieder ran...
    Nimm statt SendMessage PostMessage und schicke die Nachricht als Broadcast. Hier ein Beispiel als Konsolenanwendung (müsste mit Service aber genauso gehen):

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Module Module1
    3. <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
    4. Public Function PostMessage(ByVal hwnd As IntPtr, _
    5. ByVal msg As Integer, _
    6. ByVal wparam As IntPtr, _
    7. ByVal lparam As IntPtr) As Integer
    8. End Function
    9. Private Enum ScreenParams As Int32
    10. HWND_BROADCAST = &HFFFF
    11. SC_MONITORPOWER = &HF170
    12. WM_SYSCOMMAND = &H112
    13. TURN_MONITOR_OFF = 2
    14. TURN_MONITOR_ON = -1
    15. End Enum
    16. Sub Main()
    17. ' Ausknipsen
    18. PostMessage(ScreenParams.HWND_BROADCAST, _
    19. ScreenParams.WM_SYSCOMMAND, _
    20. ScreenParams.SC_MONITORPOWER, _
    21. ScreenParams.TURN_MONITOR_OFF)
    22. 'Warten
    23. Threading.Thread.Sleep(4000)
    24. ' Anknipsen
    25. PostMessage(ScreenParams.HWND_BROADCAST, _
    26. ScreenParams.WM_SYSCOMMAND, _
    27. ScreenParams.SC_MONITORPOWER, _
    28. ScreenParams.TURN_MONITOR_ON)
    29. End Sub
    30. End Module

    Gruß FatFire
    Doch, geht, irgendwas musst Du verkehrt machen. Hab es hier in einem Service getestet.

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Imports System.Runtime.InteropServices
    3. Public Class Service1
    4. <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
    5. Public Shared Function PostMessage(ByVal hwnd As IntPtr, _
    6. ByVal msg As Integer, _
    7. ByVal wparam As IntPtr, _
    8. ByVal lparam As IntPtr) As Integer
    9. End Function
    10. Private Enum ScreenParams As Int32
    11. HWND_BROADCAST = &HFFFF
    12. SC_MONITORPOWER = &HF170
    13. WM_SYSCOMMAND = &H112
    14. TURN_MONITOR_OFF = 2
    15. TURN_MONITOR_ON = -1
    16. End Enum
    17. Public Sub MonitorOffOn()
    18. Thread.Sleep(3000)
    19. ' Ausknipsen
    20. PostMessage(ScreenParams.HWND_BROADCAST, _
    21. ScreenParams.WM_SYSCOMMAND, _
    22. ScreenParams.SC_MONITORPOWER, _
    23. ScreenParams.TURN_MONITOR_OFF)
    24. 'Warten
    25. Thread.Sleep(100)
    26. ' Anknipsen
    27. PostMessage(ScreenParams.HWND_BROADCAST, _
    28. ScreenParams.WM_SYSCOMMAND, _
    29. ScreenParams.SC_MONITORPOWER, _
    30. ScreenParams.TURN_MONITOR_ON)
    31. End Sub
    32. Protected Overrides Sub OnStart(ByVal args() As String)
    33. Dim Thread As New Thread(AddressOf MonitorOffOn)
    34. Thread.Start()
    35. End Sub
    36. Protected Overrides Sub OnStop()
    37. End Sub
    38. End Class

    Also: check mal, was bei Deinem Service da verkehrt läuft. Eventuell könnte wer anders mal obiges ausprobieren (denkt dran, noch einen Installer dazuzupacken). Betriebssystemunterschiede dürften da ja wohl nichts ausmachen?!? Hier Windows XP SP3.

    Gruß FatFire
    Ja, dann liegt wohl der Fehler in Haufes Service und nicht unseren Ideen...könnte man jetzt natürlich mal darüber streiten, was vorzuziehen ist, ob SendMessage oder PostMessage...ich tendiere ja eher zu PostMessage (klar, ist ja auch meine Idee :D ), weil ich in einem Service kein Handle hab, kein bestimmtes Handle anspreche (sondern Broadcaste) und auch keine Rückantwort erwarte (letztendlich ist es ja wurscht, ob der Monitor aus- und angeht oder nicht, soll ja ein Feature sein und kein Bug werden). Was spräche für SendMessage?

    Gruß FatFire
    Dann liegt es wahrscheinlich an den 64-Bit...ich schätze mal, es hat mit dem verwendeten Handle, bzw. dem Broadcast-Handle zu tun. Da ich nur per Remote momentan auf einer 64-Bit-Kiste testen kann (wo das mit dem Monitor nicht nachvollziehbar ist), müssen wir da ein wenig rumprobieren.

    Ändere mal folgende Zeile:

    VB.NET-Quellcode

    1. HWND_BROADCAST = &HFFFF

    in dieses:

    VB.NET-Quellcode

    1. HWND_BROADCAST = &HFFFFFFFF


    Es funktioniert so auch weiterhin unter 32-Bit. Ich hoffe, dass es dann auch mit 64-Bit läuft. Erklärung: Die HWND-Grösse hat sich auf 64 Bit geändert, von denen allerdings nur 32 für die Identifikation genutzt werden. Vorher war der Handle nur 32 Bit gross, aber es wurden auch nur 16 Bit wegen der Kompatibilität zu 16-Bit Anwendungen genutzt.

    Gruß FatFire

    PS: Ich muss mir glaube ich wirklich langsam mal Win 7 64-Bit holen. Ich bin zwar total happy mit XP, aber ich renne immer wieder in so Inkompatibilitätsprobleme rein, die für mich zuerst immer schlicht nicht nachvollziehbar sind.