Monitor abschalten über Dienst
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
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
- Public Class Service1
- 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
- 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
- Protected Overrides Sub OnStart(ByVal args() As String)
- ' Code zum Starten des Dienstes hier einfügen. Diese Methode sollte Vorgänge
- ' ausführen, damit der Dienst gestartet werden kann.
- Dim hwnd As IntPtr = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", Nothing)
- SendMessage(hwnd, &H112, &HF170, 2)
- End Sub
- Protected Overrides Sub OnStop()
- ' Hier Code zum Ausführen erforderlicher Löschvorgänge zum Beenden des Dienstes einfügen.
- End Sub
- 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 dasDieser 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 dasDieser 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
- Imports System.Runtime.InteropServices
- Module Module1
- <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
- Public Function PostMessage(ByVal hwnd As IntPtr, _
- ByVal msg As Integer, _
- ByVal wparam As IntPtr, _
- ByVal lparam As IntPtr) As Integer
- End Function
- Private Enum ScreenParams As Int32
- HWND_BROADCAST = &HFFFF
- SC_MONITORPOWER = &HF170
- WM_SYSCOMMAND = &H112
- TURN_MONITOR_OFF = 2
- TURN_MONITOR_ON = -1
- End Enum
- Sub Main()
- ' Ausknipsen
- PostMessage(ScreenParams.HWND_BROADCAST, _
- ScreenParams.WM_SYSCOMMAND, _
- ScreenParams.SC_MONITORPOWER, _
- ScreenParams.TURN_MONITOR_OFF)
- 'Warten
- Threading.Thread.Sleep(4000)
- ' Anknipsen
- PostMessage(ScreenParams.HWND_BROADCAST, _
- ScreenParams.WM_SYSCOMMAND, _
- ScreenParams.SC_MONITORPOWER, _
- ScreenParams.TURN_MONITOR_ON)
- End Sub
- End Module
Gruß FatFire -
-
Doch, geht, irgendwas musst Du verkehrt machen. Hab es hier in einem Service getestet.
VB.NET-Quellcode
- Imports System.Threading
- Imports System.Runtime.InteropServices
- Public Class Service1
- <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
- Public Shared Function PostMessage(ByVal hwnd As IntPtr, _
- ByVal msg As Integer, _
- ByVal wparam As IntPtr, _
- ByVal lparam As IntPtr) As Integer
- End Function
- Private Enum ScreenParams As Int32
- HWND_BROADCAST = &HFFFF
- SC_MONITORPOWER = &HF170
- WM_SYSCOMMAND = &H112
- TURN_MONITOR_OFF = 2
- TURN_MONITOR_ON = -1
- End Enum
- Public Sub MonitorOffOn()
- Thread.Sleep(3000)
- ' Ausknipsen
- PostMessage(ScreenParams.HWND_BROADCAST, _
- ScreenParams.WM_SYSCOMMAND, _
- ScreenParams.SC_MONITORPOWER, _
- ScreenParams.TURN_MONITOR_OFF)
- 'Warten
- Thread.Sleep(100)
- ' Anknipsen
- PostMessage(ScreenParams.HWND_BROADCAST, _
- ScreenParams.WM_SYSCOMMAND, _
- ScreenParams.SC_MONITORPOWER, _
- ScreenParams.TURN_MONITOR_ON)
- End Sub
- Protected Overrides Sub OnStart(ByVal args() As String)
- Dim Thread As New Thread(AddressOf MonitorOffOn)
- Thread.Start()
- End Sub
- Protected Overrides Sub OnStop()
- End Sub
- 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 ), 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:
in dieses:
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.
-
Ähnliche Themen