verhindern der Aktivierung des Bildschirmschoners?

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
DelUser01

verhindern der Aktivierung des Bildschirmschoners?

Beitrag von DelUser01 »

Hallo

Ich möchte in meiner Applikation verhindern, dass sich der Bildschirmschoner aktiviert und wenn möglich der PC nicht in den StandBy geht.
Es gibt da zwar kleine Tools (z.B. Don't Sleep), ich möchte das aber direkt über die Xbase++-Applikation machen, damit ich das bei bestimmten Protokoll-/Doku-Funktionen nutzen kann.

Hat das schon jemand geschafft?

Versuche das gerade mit Virtual Key über "keybd_Event(...)" bzw. "SendInput(...)".
Möchte aber nicht einen x-beliebigen Key senden, das könnte ja unklare Auswirkungen auf laufende Programme haben.

Gruß
Roland
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: verhindern der Aktivierung des Bildschirmschoners?

Beitrag von AUGE_OHR »

Roland Gentner hat geschrieben:dass sich der Bildschirmschoner aktiviert und wenn möglich der PC nicht in den StandBy geht.
das Standby schickt ein WM_POWERBROADCAST was du abfangen kannst.
in der Class XppApplication() findest du den Callback Slot o:systemPowerStatus.

in "nChange" kann man verschiedene Werte verwenden, hier die Windows Konstanten
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Code: Alles auswählen

const int PBT_APMQUERYSUSPEND         =    0x0000;
const int PBT_APMQUERYSTANDBY         =    0x0001;
const int PBT_APMQUERYSUSPENDFAILED   =    0x0002;
const int PBT_APMQUERYSTANDBYFAILED   =    0x0003;
const int PBT_APMSUSPEND              =    0x0004;
const int PBT_APMSTANDBY              =    0x0005;
const int PBT_APMRESUMECRITICAL       =    0x0006;
const int PBT_APMRESUMESUSPEND        =    0x0007;
const int PBT_APMRESUMESTANDBY        =    0x0008;
const int PBT_APMBATTERYLOW           =    0x0009;
const int PBT_APMPOWERSTATUSCHANGE    =    0x000A;
const int PBT_APMOEMEVENT             =    0x000B;
const int PBT_APMRESUMEAUTOMATIC      =    0x0012;
gruss by OHR
Jimmy
DelUser01

Re: verhindern der Aktivierung des Bildschirmschoners?

Beitrag von DelUser01 »

Hallo Jimmy

danke für die Info - ich probiere das mit dem o:SystemPowerStatus.

Das mit dem Bildschirmschoner habe ich gerade im Test. Mit den VirtualKeys scheint es jetzt zu funktionieren...

Gruß
Roland
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: verhindern der Aktivierung des Bildschirmschoners?

Beitrag von Jan »

Ich weiß nicht ... Wenn der Anwender in der Systemsteuerung etwas einstellt, dann greife ich da ungerne ein. Ich finde, sowas macht man nicht.

Hat es bestimmte, zwingende Gründe, warum Du die abschalten willst?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
DelUser01

Re: verhindern der Aktivierung des Bildschirmschoners?

Beitrag von DelUser01 »

Hallo Jan,

Du hast vollkommen Recht - das Gesamtsystem soll auch in keiner Weise ausgehebelt werden. Daran bin ich selbst schon deshalb interessiert da ich das Netz seit Jahrzehnten aufgebaut und betreut habe (externer Dienstleister).
Deshalb will ich ja diese Funktionen über meine Applikation steuern.

Ich Sage Euch um was es geht dann erklärt sich meine Vorgehensweise:
An einem PC meldet sich ein User an und ruft eine Steuerungsüberwachung auf.
Jetzt wir der Desktop oder das Fenster des Überwachungsprogramms per Hardcopy regelmäßig wiederkehrend auf einen WebServer übertragen und kann so überall eingesehen werden.
Da die Einstellungen aller PCs und User zentral gesteuert werden - so auch Hintergrundbild, Bildschirmschoner usw. - muss eben während der Laufzeit der gesamten Übertragungszeit (Tage/Wochen) der Bildschirmschoner und ev. auch die StandBy-Funktion an diesem PC für diesen User deaktiviert werden.

Wie ich vorhin festgestellt habe wird die StandBy-Funktion und der Bildschirmschoner bereits durch die regelmäßige Hardcopy-Funktion verhindert. Die Hardcopy-Wiederholzeit muss eben kürzer sein als das TimeOut des Bildschirmschoners.
Wenn die Übertragung zum WebServer vom User abgeschaltet wird aktiviert sich entsprechend den Systemvorgaben der Bildschirmschoner wieder.
Diese dann wieder abzuschalten habe ich noch nicht in den Griff bekommen, da macht die HardCopy-Funktion dann eben viele Bilder vom Bildschirmschoner...

Grüße
Roland
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: verhindern der Aktivierung des Bildschirmschoners?

Beitrag von AUGE_OHR »

Roland Gentner hat geschrieben:An einem PC meldet sich ein User an und ruft eine Steuerungsüberwachung auf.
Jetzt wir der Desktop oder das Fenster des Überwachungsprogramms per Hardcopy regelmäßig wiederkehrend auf einen WebServer übertragen und kann so überall eingesehen werden.
"wer / was" macht die regelmässige Hardcopy ?
ist es ein externes Tool oder deine Xbase++ Applikation mit

Code: Alles auswählen

#define VK_SNAPSHOT 0x2C
// 0 is entire screen, 1 is active window
keybd_Event( VK_SNAPSHOT,nWindow,0,0)
Roland Gentner hat geschrieben:Die Hardcopy-Wiederholzeit muss eben kürzer sein als das TimeOut des Bildschirmschoners.
das kannst du über die API "SystemParametersInfoA" abfragen / setzten

Code: Alles auswählen

// ScreenSaver 
#define SPI_GETSCREENSAVETIMEOUT 0x000E
#define SPI_SETSCREENSAVETIMEOUT 0x000F
#define SPI_GETSCREENSAVEACTIVE 0x0010
#define SPI_SETSCREENSAVEACTIVE 0x0011

FUNCTION IsScreenSaverActive()
LOCAL nActive := 0
   DllCall( "User32.dll", DLL_STDCALL, "SystemParametersInfoA", ;
            SPI_GETSCREENSAVEACTIVE, 0, @nActive, 0 )
RETURN ( nActive # 0 )
den ScreenSaver starten kann man so

Code: Alles auswählen

#define WM_SYSCOMMAND 0x0112
#define SC_SCREENSAVE 0xF140
   DllCall("User32.DLL",DLL_STDCALL,"SendMessageA",;
                       AppDesktop():GetHWnd(),WM_SYSCOMMAND,SC_SCREENSAVE,0,0)
Roland Gentner hat geschrieben:Wenn die Übertragung zum WebServer vom User abgeschaltet wird aktiviert sich entsprechend den Systemvorgaben der Bildschirmschoner wieder.
läuft dann noch deine Applikation ?

Was macht ein normaler User wenn er den angesprungenen Bildschirmschoner wieder weg haben will ... er bewegt die Maus.
innerhalb einer Xbase++ Event Loop kann man ja bei AppEvent() den 4th Parameter nutzen

Code: Alles auswählen

nEvent  := AppEvent( [@<mp1>], [@<mp2>], [@<oXbp>], [<nTimeOut>] )
DO CASE
    CASE nEvent = xbe_None // wenn 4th Parameter nTimeOut
       MoveMouse() // bewegt die Maus 
zum bewegen der Maus gibt es diese API Function

Code: Alles auswählen

FUNCTION MAUS2MOVE( x, y )
   DllCall( 'User32', DLL_STDCALL, 'mouse_event', 32769, x, y, 0, 0 )
RETURN NIL
die X,Y Koordinaten entsprechen der Bildauflösung als 8-Bit Wert.

Code: Alles auswählen

FUNCTION WAY_X( xposi )
LOCAL nRET  := 0                                            // max 65536
LOCAL nMaxX := AppDesktop() :CurrentSize() [1]
   nRET := ( xposi / nMaxX ) * 65536
RETURN ( INT( nRET ) )

FUNCTION WAY_Y( yposi )

LOCAL nRET  := 0                                            // max 65536
LOCAL nMaxY := AppDesktop() :CurrentSize() [2]
   nRET := 65536 - ( ( yposi / nMaxY ) * 65536 )
RETURN ( INT( nRET ) )
du musst also nur die Maus um +/- 1 Pixel bewegen damit der Bildschirmschoner nicht anspringt.
gruss by OHR
Jimmy
DelUser01

Re: verhindern der Aktivierung des Bildschirmschoners?

Beitrag von DelUser01 »

Hallo Jimmy

ich versuche Deine Fragen zu beantworten:
"wer / was" macht die regelmässige Hardcopy ?
ist es ein externes Tool oder deine Xbase++ Applikation mit
genau darum geht es, alles mit Xbase++ zu lösen.
das kannst du über die API "SystemParametersInfoA" abfragen / setzten
den Timeout des Bildschirmschoners kenne ich ja, den habe ich ja selbst für alle "erzwungen".
läuft dann noch deine Applikation ?
ja, meine Applikation läuft (fast) immer. Ob mit oder ohne Bildschirmschoner.
...Maus bewegen,,,
die Maus soll eben nicht bewegt werden. Derjenige der den Bildschirminhalt über Internet betrachtet ist nicht derselbe der vor dem PC sitzt. Es kann Gründe geben die Maus genau so stehen zu lassen wie der User das gemacht hat. Ob das bei +/- 1 Pixel ein Problem geben könnte kann ich mir zwar auch nicht vorstellen, aber es geht bestimmt auch anders.

Wie schon zuvor geschrieben scheint die HardCopy-Funktion per VirtualKey denselben Effekt zu haben wie eine User-Aktion über Tastatur/Maus - der BildschirmSchoner wird nichtmehr aktiviert und der StandBy-Mode auch nicht.
Das funktioniert und ist für meine Zwecke ausreichend, aber es ist eigentlich nicht die Kernfunktion: ScreenSaver aus/an

Es gibt aber noch das Problem des TimeOut beim BildschirmSchoner und die Wartezeit beim Wiederholen der HardCopy. Der BildschirmSchoner springt bei 10 Minuten an, die HardCopy würde Stündlich reichen (Nachts/Wochenende).
Wie schalte ich also den ScreenSaver aus damit ich dann eine HardCopy machen kann...

Gruß
Roland
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: verhindern der Aktivierung des Bildschirmschoners?

Beitrag von AUGE_OHR »

Roland Gentner hat geschrieben:Ob das bei +/- 1 Pixel ein Problem geben könnte kann ich mir zwar auch nicht vorstellen, aber es geht bestimmt auch anders.
ich rede von +1 Pixel und dann -1 Pixel = 0
du kannst ja auch ein o:resize machen oder o:minimize / normalize ...
Roland Gentner hat geschrieben:Es gibt aber noch das Problem des TimeOut beim BildschirmSchoner und die Wartezeit beim Wiederholen der HardCopy.
Der BildschirmSchoner springt bei 10 Minuten an, die HardCopy würde Stündlich reichen (Nachts/Wochenende).
Wie schalte ich also den ScreenSaver aus damit ich dann eine HardCopy machen kann...
in dem du in deiner Function zuerst abfragst ob der ScreenSaver "jetzt" läuft mit der Konstanten SPI_GETSCREENSAVERRUNNING.
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
SPI_GETSCREENSAVERRUNNING 0x0072

Determines whether a screen saver is currently running on the window station of the calling process. The pvParam parameter must point to a BOOL variable that receives TRUE if a screen saver is currently running, or FALSE otherwise.
also könnte deine Function so aussehen

Code: Alles auswählen

#define SPI_GETSCREENSAVERRUNNING 0x0072

FUNCTION HardCopy()
...
DO WHILE IsScrSaverRunning()
    MoveMaus()
    SLEEP(10)
ENDDO
SLEEP(10)
// nWindow 0 is entire screen, 1 is active window
keybd_Event( VK_SNAPSHOT,nWindow,0,0)
...
RETURN NIL

FUNCTION  IsScrSaverRunning()
LOCAL nActive := 0
   DllCall( "User32.dll", DLL_STDCALL, "SystemParametersInfoA", ;
            SPI_GETSCREENSAVERRUNNING, 0, @nActive, 0 )
RETURN ( nActive # 0 )
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: verhindern der Aktivierung des Bildschirmschoners?

Beitrag von AUGE_OHR »

Nachtrag : aktuelle Position der Maus (Cursor)

Code: Alles auswählen

FUNCTION GetCursorPos(oDialog)
LOCAL sPoint := REPLICATE( CHR( 0 ), 8 )
LOCAL nX     := 0
LOCAL nY     := 0
LOCAL oApp  := GetApplication()

STATIC GetCursorPos

   IF GetCursorPos = NIL
      GetCursorPos := DllPrepareCall( "user32.dll", DLL_STDCALL, ;
                                      "GetCursorPos" )
   ENDIF
   DllExecuteCall( GetCursorPos, @sPoint )

   nX := BIN2L( SUBSTR( sPoint, 1, 4 ) )
   nY := BIN2L( SUBSTR( sPoint, 5, 4 ) )

   IF oApp:origin = XBP_ORIGIN_BOTTOMLEFT
       nY := ( - 1 * nY ) + APPDESKTOP() :CURRENTSIZE() [2] - 1  // 
   ENDIF

RETURN ( { nX, nY } )
gruss by OHR
Jimmy
DelUser01

Re: verhindern der Aktivierung des Bildschirmschoners?

Beitrag von DelUser01 »

Hallo Jimmy,

habe übersehen dass Du die Mausposition ja gleich wieder korrigiert.

Was ich vergessen habe:
Wenn der Bildschirmschon er aktiv ist muss auch das Passwort wieder eingegeben werden um diesen wieder weg zu bekommen.
Das wird vermutlich schon schwieriger. Deshalb besser gleich kein Bildschirmschoner aktivieren lassen...
(obwohl es für den vorliegenden Fall möglich wäre das User-Passwort zwischenzuspeichern).

Gruß
Roland
Antworten