本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。
在Windows操作系统中,存在很多Windows Station。而每一个Windows Station又存在一个或者多个Windows Desktop。我们一般所说的桌面只是这些众多桌面中的一个。以下内容将介绍如何使用WMI查询桌面的相关信息。(转载请指明出于breaksoftware的csdn博客)
如何使用WMI枚举所有的桌面?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT * FROM Win32_Desktop" );
recvnotify.ExcuteFun();
一些字段我会在之后解释,我们先看下Name这个字段。每个桌面都有自己的Name信息。在我当前XP系统中,存在以下桌面的名字:
NT AUTHORITY\SYSTEM
NT AUTHORITY\LOCAL SERVICE
NT AUTHORITY\NETWORK SERVICE
我当前登录的域+用户名(对应名字省略)
.DEFAULT
一般来说,我们会比较关心一般意义上的桌面信息。我们可以通过指定域+用户名的方式获取它的信息:SELECT * FROM Win32_Desktop WHERE NAME = 'Your Login Name'。
如何使用WMI判断指定桌面是否支持ALT+TAB(快速任务切换)?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT CoolSwitch FROM Win32_Desktop WHERE Name = 'Your Login Name'" );
recvnotify.ExcuteFun();
可以见的,我的电脑上是支持ALT+TAB进行切换的。 如何使用WMI查询光标闪烁的时间间隔时间?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT CursorBlinkRate FROM Win32_Desktop WHERE Name = 'Your Login Name'" );
recvnotify.ExcuteFun();
这个时间是以毫秒为单位的。可以见的,在我这个桌面中光标闪烁的时间间隔是530毫秒。
如何使用WMI判断拖动窗口时,窗口内部也在跟着移动?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT DragFullWindows FROM Win32_Desktop WHERE Name = 'Your Login Name'" );
recvnotify.ExcuteFun();
我们按住非客户区拖动窗口,可能存在两种效果:
1 原窗口还在原来位置,而只有一个空心的框子跟着我们鼠标在拖动。等到我们鼠标松开,窗口才移动过去。这种情况,我们的查询将返回FALSE。
2 原窗口随着鼠标的位置移动而移动。这种情况我们将返回TRUE。
如何使用WMI查询桌面上两个图标之间的距离?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT IconSpacing FROM Win32_Desktop WHERE Name = 'Your Login Name'" );
recvnotify.ExcuteFun();
可以见得我这个桌面中两个图标之间的间距是43像素,我量了一下,的确如此。
如何使用WMI获取桌面图标下的文字的字体?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT IconTitleFaceName FROM Win32_Desktop WHERE Name = 'Your Login Name'" );
recvnotify.ExcuteFun();
如何使用WMI查询桌面图标下的文字字体大小?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT IconTitleSize FROM Win32_Desktop WHERE Name = 'Your Login Name'" );
recvnotify.ExcuteFun();
注意此处是使用Point为单位的。
如何使用WMI判断是否开启了屏保?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT ScreenSaverActive FROM Win32_Desktop WHERE Name = 'Your Login Name'" );
recvnotify.ExcuteFun();
该字段为TRUE就是启用了屏保。
如何使用WMI获取屏保程序的路径?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT ScreenSaverExecutable FROM Win32_Desktop WHERE Name = 'Your Login Name'" );
recvnotify.ExcuteFun();
如何使用WMI判断从屏保恢复后是否需要输入密码?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT ScreenSaverSecure FROM Win32_Desktop WHERE Name = 'Your Login Name'" );
recvnotify.ExcuteFun();
可见当前桌面中从屏保恢复后不用输入密码。
如何使用WMI获取需要等待多久才开启屏保?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT ScreenSaverTimeout FROM Win32_Desktop WHERE Name = 'Your Login Name'" );
recvnotify.ExcuteFun();
这个时间单位是秒。可以见得当前桌面等待600秒后将进入屏保程序。
如何使用WMI查询桌面的背景图路径?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT Wallpaper FROM Win32_Desktop WHERE Name = 'Your Login Name'" );
recvnotify.ExcuteFun();
如何使用WMI判断桌面背景图是拉伸效果?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT WallpaperStretched FROM Win32_Desktop WHERE Name = 'Your Login Name'" );
recvnotify.ExcuteFun();
可以见的,当前桌面的背景图是拉伸效果。但是如果该值是FALSE,则说明不是拉伸效果,即可能是平铺或者居中。那
如何使用WMI在已知不是拉伸效果的情况下,如何判断是平铺或者居中呢?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT WallpaperTiled FROM Win32_Desktop WHERE Name = 'Your Login Name'" );
recvnotify.ExcuteFun();
在WallpaperStretched为FALSE的情况下,如果WallpaperTiled为TRUE,则证明当前桌面背景图是平铺的,否则说明是居中的。
更多的信息在Win32_Desktop。
工程源码见《WMI技术介绍和应用——WMI概述》结尾。