Seite 2 von 3

Re: Eneriesparplan Monitor Win7

Verfasst: 07.10.2014 14:55
von _JON_
ts-soft hat geschrieben:Du findest keine Sicherheitslücke in Windows, das wäre dann schon merkwürdig.
Nicht verzagen Google fragen: Windows 7 UAC whitelist: Code-injection Issue
Funktioniert bei Windows 7 und 8.0, aber nur mit der Standard UAC Einstellung

Re: Eneriesparplan Monitor Win7

Verfasst: 07.10.2014 15:40
von ts-soft
@_JON_
Ich verstehe zwar das ganze englische Zeuchs nicht, aber wie ich UAC austrickse, ist mir bekannt.
Aber was nützt das auf einem Fremdrechner, wo ich eingeschränkte Rechte habe, und darum
geht es doch hier. Wahrscheinlich noch mit Domäne und Active Directory.

Gruß
Thomas

Re: Eneriesparplan Monitor Win7

Verfasst: 07.10.2014 16:03
von _JON_
Hartl hat nie erwähnt das es sich um einen Fremdrechner handelt.
Und eingeschränkte Rechte kann vieles heißen ...

Re: Eneriesparplan Monitor Win7

Verfasst: 07.10.2014 23:31
von Hartl
Da es sich ja bei dem "SystemParametersInfo" um eine API handelt und auf dem eingeschränkten Rechner funktioniert, wollte ich auch die API "PowerSetActiveScheme" einmal ausprobieren.
Eine Mausbewegung zu produzieren um den Standby zu verhindern wollte ich vermeiden, da das "Gezappel" des Mauszeigers bei für manche Tätigkeiten ungeeignet ist.
Könnte mir trotzdem jemand einmal ein Beispiel geben für das "PowerSetActiveScheme".

Grüße
Gerhard

Re: Eneriesparplan Monitor Win7

Verfasst: 08.10.2014 19:15
von Sicro
Versuche es mal damit:

Code: Alles auswählen

; WICHTIG: Die Ausführungen werden nur verhindert, wenn das Programmfenster den Fokus hat

Procedure CBTProc(nCode, wParam, lParam)
  If nCode = #HCBT_SYSCOMMAND
    If wParam = #SC_MONITORPOWER
      Select lParam
        Case -1 ; Monitor will sich einschalten
          ; ProcedureReturn #True ; Ausführung ablehnen
          
        Case 1  ; Monitor will in den Standby-Modus
          ProcedureReturn #True ; Ausführung ablehnen
          
        Case 2  ; Monitor will sich ausschalten
          ; ProcedureReturn #True ; Ausführung ablehnen
      EndSelect
      
    ElseIf wParam = #SC_SCREENSAVE ; Bildschirmschoner will sich starten
      ProcedureReturn #True ; Ausführung ablehnen
    EndIf
  EndIf
    
  ProcedureReturn CallNextHookEx_(0, nCode, wParam, lParam)
EndProcedure

Define Hook, Event

Hook = SetWindowsHookEx_(#WH_CBT, @CBTProc(), GetModuleHandle_(0), GetCurrentThreadId_())
If Hook = 0
  Debug "Hook konnte nicht gesetzt werden"
EndIf

OpenWindow(0, 0, 0, 400, 400, "Monitor-Standby und Bildschirmschoner verhindern", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

UnhookWindowsHookEx_(Hook)
Beachte den Hinweis oben im Code. Vielleicht kann man diese Einschränkung vermeiden, wenn man die Hook-Procedure in einer DLL auslagert.

Re: Eneriesparplan Monitor Win7

Verfasst: 11.10.2014 21:26
von Hartl
@Sicro
... funktioniert nur zu 50%.
Der Bildschirmschoner bleibt weg, nur der Monitor Standby kommt nach wie vor. :cry:

Re: Eneriesparplan Monitor Win7

Verfasst: 11.10.2014 22:04
von Sicro
Ich habe den Code jetzt mal getestet und festgestellt, dass Windows das Ausschalt-Signal sendet.
Entkommentiere den Code bei "Case 2":

Code: Alles auswählen

Case 2  ; Monitor will sich ausschalten
  Debug "Monitor will sich ausschalten"
  ProcedureReturn #True ; Ausführung ablehnen
So funktioniert es bei mir unter Windows 7.

Re: Eneriesparplan Monitor Win7

Verfasst: 15.10.2014 11:13
von Hartl
Jetzt funktioniert es, den Auskommentierten Text unter Case 2 hatte ich übersehen.

Ich habe noch eine Lösung gefunden die Funktioniert >SetThreadExecutionState<, auch ohne Adminrechte. :D

Grüße
Gerhard

Verfasst: 15.10.2014 11:25
von CodeCommander
~ DELETE ~

Re: Eneriesparplan Monitor Win7

Verfasst: 15.10.2014 11:28
von RSBasic

Code: Alles auswählen

EnableExplicit

#ES_AWAYMODE_REQUIRED = $00000040
#ES_CONTINUOUS = $80000000
#ES_DISPLAY_REQUIRED = $00000002
#ES_SYSTEM_REQUIRED = $00000001
#ES_USER_PRESENT = $00000004

If OpenLibrary(0, "Kernel32.dll")
  Prototype SetThreadExecutionState(esFlags)
  Define SetThreadExecutionState.SetThreadExecutionState = GetFunction(0, "SetThreadExecutionState")
  CloseLibrary(0)
EndIf

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(1, 10, 10, 200, 20, "Standby-Plan deaktivieren", 0)
  ButtonGadget(2, WindowWidth(0)-210, 10, 200, 20, "Standby-Plan aktivieren", 0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Debug SetThreadExecutionState(#ES_CONTINUOUS | #ES_SYSTEM_REQUIRED | #ES_AWAYMODE_REQUIRED | #ES_DISPLAY_REQUIRED);Falls 0, dann Fehler
          Case 2
            Debug SetThreadExecutionState(#ES_CONTINUOUS);Falls 0, dann Fehler
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf