verhindern der Aktivierung des Bildschirmschoners?
Moderator: Moderatoren
verhindern der Aktivierung des Bildschirmschoners?
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
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
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: verhindern der Aktivierung des Bildschirmschoners?
das Standby schickt ein WM_POWERBROADCAST was du abfangen kannst.Roland Gentner hat geschrieben:dass sich der Bildschirmschoner aktiviert und wenn möglich der PC nicht in den StandBy geht.
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
Jimmy
Re: verhindern der Aktivierung des Bildschirmschoners?
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
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
- Jan
- Marvin
- Beiträge: 14662
- 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?
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Re: verhindern der Aktivierung des Bildschirmschoners?
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
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
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: verhindern der Aktivierung des Bildschirmschoners?
"wer / was" macht die regelmässige Hardcopy ?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.
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)
das kannst du über die API "SystemParametersInfoA" abfragen / setztenRoland Gentner hat geschrieben:Die Hardcopy-Wiederholzeit muss eben kürzer sein als das TimeOut des Bildschirmschoners.
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 )
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)
läuft dann noch deine Applikation ?Roland Gentner hat geschrieben:Wenn die Übertragung zum WebServer vom User abgeschaltet wird aktiviert sich entsprechend den Systemvorgaben der Bildschirmschoner wieder.
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
Code: Alles auswählen
FUNCTION MAUS2MOVE( x, y )
DllCall( 'User32', DLL_STDCALL, 'mouse_event', 32769, x, y, 0, 0 )
RETURN NIL
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 ) )
gruss by OHR
Jimmy
Jimmy
Re: verhindern der Aktivierung des Bildschirmschoners?
Hallo Jimmy
ich versuche Deine Fragen zu beantworten:
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
ich versuche Deine Fragen zu beantworten:
genau darum geht es, alles mit Xbase++ zu lösen."wer / was" macht die regelmässige Hardcopy ?
ist es ein externes Tool oder deine Xbase++ Applikation mit
den Timeout des Bildschirmschoners kenne ich ja, den habe ich ja selbst für alle "erzwungen".das kannst du über die API "SystemParametersInfoA" abfragen / setzten
ja, meine Applikation läuft (fast) immer. Ob mit oder ohne Bildschirmschoner.läuft dann noch deine Applikation ?
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....Maus bewegen,,,
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
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: verhindern der Aktivierung des Bildschirmschoners?
ich rede von +1 Pixel und dann -1 Pixel = 0Roland 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.
du kannst ja auch ein o:resize machen oder o:minimize / normalize ...
in dem du in deiner Function zuerst abfragst ob der ScreenSaver "jetzt" läuft mit der Konstanten SPI_GETSCREENSAVERRUNNING.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...
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
also könnte deine Function so aussehenSPI_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.
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
Jimmy
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: verhindern der Aktivierung des Bildschirmschoners?
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
Jimmy
Re: verhindern der Aktivierung des Bildschirmschoners?
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
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