如何检查Linux控制台屏幕保护程序是否屏蔽了屏幕
是否有方法通过编程(通过ioctl()等)或通过读取/sys、/proc或/dev中的文件来检查屏幕是否被Linux控制台屏幕保护程序屏蔽 谢谢并致以最良好的祝愿如何检查Linux控制台屏幕保护程序是否屏蔽了屏幕,linux,console,screensaver,Linux,Console,Screensaver,是否有方法通过编程(通过ioctl()等)或通过读取/sys、/proc或/dev中的文件来检查屏幕是否被Linux控制台屏幕保护程序屏蔽 谢谢并致以最良好的祝愿 Günter我很久没有做过任何桌面开发了,但内存告诉我,大多数linux屏幕保护程序都是由xscreensaver执行的——可能是检查进程是否正在运行,或者检查其源代码以查看是否设置了任何系统状态,或者询问项目邮件列表会产生一些结果。 当然,KDE和Gnome现在可能已经有了独立的屏幕保护程序实现——在linux GUI上几乎没有统一
Günter我很久没有做过任何桌面开发了,但内存告诉我,大多数linux屏幕保护程序都是由xscreensaver执行的——可能是检查进程是否正在运行,或者检查其源代码以查看是否设置了任何系统状态,或者询问项目邮件列表会产生一些结果。
当然,KDE和Gnome现在可能已经有了独立的屏幕保护程序实现——在linux GUI上几乎没有统一性,不幸的是…您可以使用
显示集解析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
好的,我查过了。相关代码部分如下所示:
#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");
}
}
}
}
#包括
...
Display*dpy=XOpenDisplay(空);
...
int假人;
CARD16待机、暂停、关闭;
布尔奥诺夫;
CARD16州;
printf(“DPMS(能源之星):\n”);
if(DPMSQueryExtension(dpy、虚拟和虚拟))
{
if(DPM容量(dpy))
{
DPMSGetTimeout(dpy、待机、挂起和关闭);
printf(“待机:%d暂停:%d关闭:%d\n”,
待机、暂停、关闭);
DPMSInfo(dpy、state和onoff);
if(onoff)
{
printf(“DPMS已启用\n”);
开关(状态)
{
案例DPMSModeOn:
printf(“监视器打开了”\n”);
打破
案例DPMSModes备用:
printf(“监视器处于待机状态\n”);
打破
案例DPMSModesSuspend:
printf(“监视器处于挂起状态\n”);
打破
案例DPMSModeOff:
printf(“监视器关闭\n”);
打破
违约:
printf(“来自服务器的无法识别的响应\n”);
}
}
}
}
以防其他人需要;-) 我正在使用此脚本读取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
呼叫示例已打开。谢谢,这就成功了。这不是最优雅的解决方案,但检查“Monitor is on | off”的输出是可行的。这很好,但它依赖于可用的X服务器。如果你只是有一个控制台(这是罕见的,这些天,无可否认),它不会工作。在我的情况下,它是好的。我正在运行一个全屏Gtk WebKit浏览器,它像筛子一样泄漏内存,因此在屏幕关闭一段时间后,我可以安全地关闭并重新启动浏览器;-)当然,如果一开始就没有这些漏洞就好了……我会的,但我没有时间和资源来修复WebKitGTK+。。。就目前而言,肮脏的伎俩将不得不这样做。