如何检查Linux控制台屏幕保护程序是否有空白屏幕

有没有办法通过编程(通过ioctl()等)或通过读取/ sys,/ proc或/ dev中的文件检查屏幕是否被Linux控制台屏幕保护程序清空?

感谢和最好的问候,

冈特

Solutions Collecting From Web of "如何检查Linux控制台屏幕保护程序是否有空白屏幕"

你可以使用DISPLAY设置来解析xset q的输出,但不是很好。

 $ xset q Keyboard Control: auto repeat: on key click percent: 0 LED mask: 00000000 XKB indicators: 00: Caps Lock: off 01: Num Lock: off 02: Scroll Lock: off 03: Compose: off 04: Kana: off 05: Sleep: off 06: Suspend: off 07: Mute: off 08: Misc: off 09: Mail: off 10: Charging: off 11: Shift Lock: off 12: Group 2: off 13: Mouse Keys: off auto repeat delay: 250 repeat rate: 30 auto repeating keys: 00ffffffdffffbbf fadfffefffedffff 9fffffffffffffff fff7ffffffffffff bell percent: 50 bell pitch: 400 bell duration: 100 Pointer Control: acceleration: 20/10 threshold: 4 Screen Saver: prefer blanking: yes allow exposures: yes timeout: 0 cycle: 600 Colors: default colormap: 0x20 BlackPixel: 0 WhitePixel: 16777215 Font Path: /usr/share/fonts/misc,/usr/share/fonts/100dpi:unscaled,/usr/share/fonts/75dpi:unscaled,/usr/share/fonts/TTF,/usr/share/fonts/Type1,/usr/share/fonts/misc/,/usr/share/fonts/TTF/,/usr/share/fonts/Type1/,/usr/share/fonts/100dpi/,/usr/share/fonts/75dpi/,built-ins DPMS (Energy Star): Standby: 1200 Suspend: 1800 Off: 0 DPMS is Enabled Monitor is On Font cache: server does not have the FontCache Extension 

好的,检查了xset源代码 。 相关的代码部分是

 #include <X11/extensions/dpms.h> ... Display* dpy = XOpenDisplay(NULL); ... int dummy; CARD16 standby, suspend, off; BOOL onoff; CARD16 state; printf("DPMS (Energy Star):\n"); if (DPMSQueryExtension(dpy, &dummy, &dummy)) { if (DPMSCapable(dpy)) { DPMSGetTimeouts(dpy, &standby, &suspend, &off); printf (" Standby: %d Suspend: %d Off: %d\n", standby, suspend, off); DPMSInfo(dpy, &state, &onoff); if (onoff) { printf(" DPMS is Enabled\n"); switch (state) { case DPMSModeOn: printf(" Monitor is On\n"); break; case DPMSModeStandby: printf(" Monitor is in Standby\n"); break; case DPMSModeSuspend: printf(" Monitor is in Suspend\n"); break; case DPMSModeOff: printf(" Monitor is Off\n"); break; default: printf(" Unrecognized response from server\n"); } } } } 

以防万一其他人需要这个;-)

我从来没有做过任何桌面开发,但内存告诉我,大部分的linux屏保正在被xscreensaver执行 – 也许检查过程是否正在运行,或者通过源代码查看是否设置了任何系统状态,或询问项目maillist会产生一些结果。 当然,KDE和Gnome可能现在已经有单独的屏幕保护程序实现了,但是在GUI GUI方面却很少统一,不幸的是…

我正在使用这个脚本来读取DPMS信息。 这很好用! 它用PHP编写,但你可以看到它的工作原理。

 <?php if ( !$pid = exec('pidof X') ) return !trigger_error(E_USER_WARNING,'Could not find pid of X'); if ( !$data = file_get_contents("/proc/$pid/cmdline") ) return !trigger_error(E_USER_WARNING,"Cound not read pid info (/proc/$pid/cmdline)"); $data = explode(chr(0),$data); foreach($data as $key => $line) { if ( $line == "-auth" ) { $auth = $data[$key+1]; break; } } if ( !isset($auth) ) return !trigger_error(E_USER_WARNING,'Could not find XAUTHORITY in xinit process environment'); echo exec("export DISPLAY=:0; export XAUTHORITY={$auth}; export PATH=\${PATH}:/usr/X11R6/bin; xset -q | grep \"Monitor is\" | awk '{print $3}'"); ?> 

我用ctypes在Python中做了Günter代码的等价实现。

 import ctypes import struct ctypes.cdll.LoadLibrary('libXext.so') libXext = ctypes.CDLL('libXext.so') DPMSFAIL = -1 DPMSModeOn = 0 DPMSModeStandby = 1 DPMSModeSuspend = 2 DPMSModeOff = 3 def get_DPMS_state(display_name_in_byte_string=b':0'): state = DPMSFAIL if not isinstance(display_name_in_byte_string, bytes): raise TypeError display_name = ctypes.c_char_p() display_name.value = display_name_in_byte_string libXext.XOpenDisplay.restype = ctypes.c_void_p display = ctypes.c_void_p(libXext.XOpenDisplay(display_name)) dummy1_i_p = ctypes.create_string_buffer(8) dummy2_i_p = ctypes.create_string_buffer(8) if display.value: if libXext.DPMSQueryExtension(display, dummy1_i_p, dummy2_i_p)\ and libXext.DPMSCapable(display): onoff_p = ctypes.create_string_buffer(1) state_p = ctypes.create_string_buffer(2) if libXext.DPMSInfo(display, state_p, onoff_p): onoff = struct.unpack('B', onoff_p.raw)[0] if onoff: state = struct.unpack('H', state_p.raw)[0] libXext.XCloseDisplay(display) return state 

调用示例是在我的github上 。