Monitor ausmachen per WPF?

  • WPF

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von BasicSharpx3.

    Definiere "ausschalten".
    Soll der Bildschirm schwarz werden? Soll die Hintergrundbeleuchtung ausgeschaltet werden? Soll das komplette Gerät ausgeschaltet werden? Soll nur die Touch-Funktionalität deaktiviert werden, das Bild aber erhalten bleiben?
    Um was für einen Monitor handelt es sich überhaupt? Externes Gerät? Wenn ja: welches Modell? Oder Laptop?
    Und warum gehst Du davon aus, dass Du WPF dafür brauchst?
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Wenn dein Monitor nach dem "ausschalten" in deinem genannten Szenario noch auf die Touches reagiert und durch den PC wie bei MouseEvents wieder "eingeschaltet" wird, dann reicht ein SendMessage zum ausschalten
    stackoverflow.com/questions/713498/turn-on-off-monitor
    sonst wird das so wohl nicht realisierbar sein.
    And i think to myself... what a wonderfuL World!

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

    Hööy habe dass gleiche Problem nur möchte ich ein Service drauß machen, dass er mir meine Tablets von 00:00 - 06:00 Uhr das Display ausschaltet und dann um 6e wieder einschaltet und in den Bildschirmschoner reingeht..
    Code habe ich am PC funktionierts aber am Tablet nicht??..

    VB.NET-Quellcode

    1. Private WM_SYSCOMMAND As Integer = &H112
    2. Private SC_MONITORPOWER As Integer = &HF170
    3. Private WM_SYSCOMMAND2 As Integer = &H112&
    4. Private SC_SCREENSAVE As Integer = &HF140&
    5. Private oTimer1 As Timer
    6. <DllImport("user32.dll", EntryPoint:="SendMessageA")>
    7. Private Shared Sub SendMessage(ByVal hWnd As IntPtr, ByVal uMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32)
    8. End Sub
    9. Private Sub OnTimedEvent1(ByVal state As Object)
    10. Try
    11. Dim sUhrzeit As String = Date.Now.ToShortTimeString
    12. Select Case sUhrzeit
    13. Case "00:10"
    14. SendMessage(&HFFFF, WM_SYSCOMMAND, SC_MONITORPOWER, 2)
    15. Case "00:15" 'Test
    16. SendMessage(&HFFFF, WM_SYSCOMMAND, SC_MONITORPOWER, 1&)
    17. SendMessage(&HFFFF, WM_SYSCOMMAND2, SC_SCREENSAVE, 0&)
    18. End Select
    19. Catch ex As Exception
    20. File.Create(AppDomain.CurrentDomain.BaseDirectory + "FAIL")
    21. End Try
    22. End Sub


    Wäre nett wenn mir jemand damit helfen könnte komme seit nem Tag nicht weiter :D
    Mich stört es ganz heftig dass du die Zeit in String umwandelst. Laut deiner Programmierung muss man vorraussetzen, dass der Rechner die ganze zeit an ist. Das ist sehr ungünstig. Sowie ich dein Problem verstanden habe soll die Zeit zwischen 00:00 - 06:00 aus sein. Das macht man dann mit einem DateTime und TimeSpan.

    In deinem Fall ist es recht einfach weil du Minuten auf 00 stellst:

    C#-Quellcode

    1. if ((DateTime.Now).Hour < 6)
    2. {
    3. //Monitor aus
    4. }
    5. else
    6. {
    7. //Monitor an
    8. }


    Das ist jetzt ziemlich verkürzt da gestellt. Mathematisch gesehen dennoch korrekt. Somit würde dein Programm unabhängig davon wann du dein Computer einschaltest den Monitor ausmachen. Vielleicht würde ich noch eine kleine Prüfung einbauen, die den Status von Monitor prüft. Damit du nicht ständig ausmachst bzw. anmachst...
    Ich vermute, dass du die Tablets nicht Debuggen kannst. Wobei das auch geht. Du brauchst irgend wie den selben User auf deinem Rechner wo du das Programm erstellst wie bei deinem Tablet. Dann muss du irgend wie den Prozess anbinden. Dann würde praktisch dein Programm auf dem Tablet laufen und wenn du in auf deinem Rechner wo du das Programm erstellst irgend wo ein Breakpoint setzt, wird es dort anhalten. Sieht bei Tablet komisch aus. Aber es funktioniert. Wie genau das geht, frag im Forum unter neuen Frage...

    Was zu deinem Problem angeht: Ich vermute, dass die die Zeit verpassen wann genau die Ausschalten sollen. Somit gerät das ganze ins nichts.

    Insgesamt wenn Du mit der Zeit arbeitest, dann belasse es bei der Zeit. Sonst wird es unendlich kompliziert. DateTime bietet schon sehr viel. Warum das Rad neu erfinden. Zu Hilfe kannst du zusätzlich TimeSpan verwenden. Mit den beiden sollte alles erschlagen sein was auch immer du willst.

    Danke für die Bewertung!
    Kein Ding bedanke mich ja schließlich bei dir :)

    Also ich glaube mein Problem ist, dass das ein Dienst wird und deswegen es Probleme gibt..
    Als normale WinForm/WPF funktioniert mein Vorhaben ohne Probleme nur dass dieganzeZeit ein Prozess läuft ist auch bisschen mies :D

    Ich hatte es am Anfang in einer Do Schleife dachte dass es funktioniert war wohl dann doch nicht so das Tablet hat nur gelaggt am Ende :D Werde gleich mal ein Tablet neu aufsetzen um das mit dem Remote Debugging hinzubekommen guter Tipp danke!

    Ich benutze Threading Timer, stimmt dieser Code so hier?

    VB.NET-Quellcode

    1. Private oTimer1 As Threading.Timer
    2. Protected Overrides Sub OnStart(ByVal args() As String)
    3. Dim oCallback1 As New TimerCallback(AddressOf OnTimedEvent1)
    4. oTimer1 = New System.Threading.Timer(oCallback1, Nothing, 200, 200)
    5. File.Create(AppDomain.CurrentDomain.BaseDirectory + "OnStart.txt") 'Check
    6. End Sub
    7. Private Sub OnTimedEvent1(ByVal state As Object)
    8. Thread.Sleep(5000)
    9. Try
    10. Dim sUhrzeit As String = Date.Now.ToShortTimeString
    11. Select Case sUhrzeit.Substring(0, 5)
    12. Case "00:10"
    13. TurnOffLCD()
    14. Case "00:15"
    15. TurnOnLCD()
    16. Thread.Sleep(1000)
    17. MonitorOn()
    18. Thread.Sleep(1000)
    19. ScreenSaver()
    20. End Select
    21. Catch ex As Exception
    22. MsgBox(ex)
    23. File.Create(AppDomain.CurrentDomain.BaseDirectory + "FAIL")
    24. End Try
    25. End Sub


    Die Subs ScreenSaver, TurnOffLcd, TurnOnLCD und MonitorOn hab ich selber geschrieben in WinForm funktionierts nur bei Service nicht :angry:

    Wäre echt gut wenn jemand was hat evtl benutzt jemand etwas ähnliches..:)
    Man man man, du hast immer noch nicht den Code auf DateTime umgestellt. DAS SOLLTEST DU ALS ERSTES MACHEN!

    guck doch mal selbst in deinen Programm. Mich wundert dass es überhaupt funktioniert. So schreibt man keine Threads. Ich weis was du mit deinem Programm erreichen wolltest, aber es ist nicht gut umgesetzt... Schreib ich mal extra für dich mal was:

    VB.NET-Quellcode

    1. ​Imports System.Windows.Threading
    2. Class MainWindow
    3. Public Sub New()
    4. InitializeComponent()
    5. DispatcherTimer.Start()
    6. End Sub
    7. Private _DispatcherTimer As DispatcherTimer = Nothing
    8. Private ReadOnly Property DispatcherTimer As DispatcherTimer
    9. Get
    10. If _DispatcherTimer Is Nothing Then
    11. _DispatcherTimer = New DispatcherTimer()
    12. _DispatcherTimer.Interval = New TimeSpan(0, 0, 10)
    13. AddHandler _DispatcherTimer.Tick, AddressOf DispatcherTimerTick
    14. End If
    15. Return _DispatcherTimer
    16. End Get
    17. End Property
    18. Private Sub DispatcherTimerTick(sender As Object, e As EventArgs)
    19. Try
    20. Dim tmpTime = DateTime.Now
    21. If tmpTime.Hour < 6 Then
    22. 'TurnOffLCD()
    23. Else
    24. 'MonitorOn()
    25. End If
    26. Catch ex As Exception
    27. 'Irgend was...
    28. End Try
    29. End Sub
    30. End Class


    So. Da hast du es. Fang nicht mit so eine Kacke an, wie "Thread.Sleep(1000)"
    Guck mal, mein Timer wird jede 10 sekunden aktiviert, macht was, und ist dann zu ende. Was du da gemacht hast:

    VB.NET-Quellcode

    1. Case "00:15"
    2. TurnOnLCD()
    3. Thread.Sleep(1000)
    4. MonitorOn()
    5. Thread.Sleep(1000)
    6. ScreenSaver()

    da würdest du nichts sehen. weil dein Prozess noch nicht abgeschlossen ist. Ich weiß jetzt nicht wie das mit dem Monitor an und aus ist. aber meist aktualisiert sich die Oberfläche erst nach beendigung des Prozesses. Der Timer darf nur kurz sein. Bei Amateuren vielleicht etwas länger, aber immer abgeschlossen.

    Wenn du schon willst, dass dein Timer für kurze zeit monitor aus macht, dann ist besser so:

    VB.NET-Quellcode

    1. Imports System.Windows.Threading
    2. Class MainWindow
    3. Public Sub New()
    4. InitializeComponent()
    5. DispatcherTimer.Start()
    6. End Sub
    7. Private _DispatcherTimer As DispatcherTimer = Nothing
    8. Private ReadOnly Property DispatcherTimer As DispatcherTimer
    9. Get
    10. If _DispatcherTimer Is Nothing Then
    11. _DispatcherTimer = New DispatcherTimer()
    12. _DispatcherTimer.Interval = New TimeSpan(0, 0, 0, 0, 500)
    13. AddHandler _DispatcherTimer.Tick, AddressOf DispatcherTimerTick
    14. End If
    15. Return _DispatcherTimer
    16. End Get
    17. End Property
    18. Private _Stopwatch As New Stopwatch()
    19. Private monitorAn As Boolean = False
    20. Private Sub DispatcherTimerTick(sender As Object, e As EventArgs)
    21. Try
    22. Dim tmpTime = DateTime.Now
    23. If tmpTime.Hour = 0 AndAlso tmpTime.Minute = 10 Then
    24. 'MonitorOn()
    25. ElseIf tmpTime.Hour = 0 AndAlso tmpTime.Minute = 15 Then
    26. If Not _Stopwatch.IsRunning Then
    27. _Stopwatch.Start()
    28. End If
    29. If _Stopwatch.Elapsed.TotalSeconds > 1 Then
    30. If monitorAn Then
    31. 'TurnOnLCD()
    32. Else
    33. 'MonitorOn()
    34. End If
    35. monitorAn = Not monitorAn
    36. _Stopwatch.Stop()
    37. _Stopwatch.Reset()
    38. _Stopwatch.Start()
    39. End If
    40. End If
    41. Catch ex As Exception
    42. 'Irgend was...
    43. End Try
    44. End Sub


    Achtung, auch der timer intervall muss kleiner sein auf 500 ms. sonst würde es nciht funktinieren...