摘要
应用程序在某些时候需要终止一个已启动的屏幕保护程序。在Windows 3.1 或 Windows 95中,传递一个 “WM_CLOSE”的消息给正在运行的屏幕保护窗口就能轻而易举的结束屏保,
如下所示:
PostMessage (GetActiveWindow(), WM_CLOSE, 0, 0L);
然而,Windows NT引入了分离桌面的概念,应用程序和屏幕保护程序能分别在两个桌面上运行。 这使得在Windows NT 或 Windows 2000下关闭屏保要稍难一些 。
更多内容
在Windows NT 或 Windows 2000下,要得到正在运行的屏保窗口的句柄不象在Windows 3.1 和 Windows 95下那样简单。在应用程序中调用GetForegroundWindow() 将返回空值,
因为屏保和应用程序运行在不同的桌面上。同样,调用FindWindow ("WindowsScreenSaverClass", NULL) 来判断屏保是否正在运行也不起作用。
只有先取得屏保程序所在桌面的句柄,列举该桌面上的窗口,之后再传递“WM_CLOSE”的消息给屏保窗口,这样才能关闭屏保。
下面的代码演示了如何做到这一点。需要指出的是如果设置了屏保口令,下面的代码执行时将调出要求输入口令的对话框,提示用户输入口令,这样一来实际上就终止了屏保。
BOOL CALLBACK KillScreenSaverFunc(HWND hwnd, LPARAM lParam)
{
if(IsWindowVisible(hwnd))
PostMessage(hwnd, WM_CLOSE, 0, 0);
return TRUE;
}
HDESK hdesk;
hdesk = OpenDesktop(TEXT("Screen-saver"),
0,
FALSE,
DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS);
if (hdesk)
{
EnumDesktopWindows(hdesk, KillScreenSaverFunc, 0);
CloseDesktop(hdesk);
}
注意,象上面所说的终止一个正在运行的屏保和完全禁止屏保的执行是不同的,在那种情况下,即使过了指定的等待时间屏保也不会再度运行了。
用下面的方法是很容易做到这一点的:
SystemParametersInfo( SPI_SETSCREENSAVEACTIVE,
FALSE,
0,
SPIF_SENDWININICHANGE
);
这一方法也能成功的关闭正在运行的屏保。不过,你将遇到一个问题,那就是系统将不再启动屏幕保护程序除非用户移动鼠标或按下键盘。
如果你需要再度启动屏保,就必须重新初始化屏保的等待时间。要做到这一点你可以:
调用 SystemParametersInfo( SPI_SETSCREENSAVEACTIVE, TRUE, 0, SPIF_SENDWININICHANGE).
或者
用SetCursorPos()来模拟用户输入。
这两种方法都将促使系统重新启动屏保等待时间计数器。
应用程序在某些时候需要终止一个已启动的屏幕保护程序。在Windows 3.1 或 Windows 95中,传递一个 “WM_CLOSE”的消息给正在运行的屏幕保护窗口就能轻而易举的结束屏保,
如下所示:
PostMessage (GetActiveWindow(), WM_CLOSE, 0, 0L);
然而,Windows NT引入了分离桌面的概念,应用程序和屏幕保护程序能分别在两个桌面上运行。 这使得在Windows NT 或 Windows 2000下关闭屏保要稍难一些 。
更多内容
在Windows NT 或 Windows 2000下,要得到正在运行的屏保窗口的句柄不象在Windows 3.1 和 Windows 95下那样简单。在应用程序中调用GetForegroundWindow() 将返回空值,
因为屏保和应用程序运行在不同的桌面上。同样,调用FindWindow ("WindowsScreenSaverClass", NULL) 来判断屏保是否正在运行也不起作用。
只有先取得屏保程序所在桌面的句柄,列举该桌面上的窗口,之后再传递“WM_CLOSE”的消息给屏保窗口,这样才能关闭屏保。
下面的代码演示了如何做到这一点。需要指出的是如果设置了屏保口令,下面的代码执行时将调出要求输入口令的对话框,提示用户输入口令,这样一来实际上就终止了屏保。
BOOL CALLBACK KillScreenSaverFunc(HWND hwnd, LPARAM lParam)
{
if(IsWindowVisible(hwnd))
PostMessage(hwnd, WM_CLOSE, 0, 0);
return TRUE;
}
HDESK hdesk;
hdesk = OpenDesktop(TEXT("Screen-saver"),
0,
FALSE,
DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS);
if (hdesk)
{
EnumDesktopWindows(hdesk, KillScreenSaverFunc, 0);
CloseDesktop(hdesk);
}
注意,象上面所说的终止一个正在运行的屏保和完全禁止屏保的执行是不同的,在那种情况下,即使过了指定的等待时间屏保也不会再度运行了。
用下面的方法是很容易做到这一点的:
SystemParametersInfo( SPI_SETSCREENSAVEACTIVE,
FALSE,
0,
SPIF_SENDWININICHANGE
);
这一方法也能成功的关闭正在运行的屏保。不过,你将遇到一个问题,那就是系统将不再启动屏幕保护程序除非用户移动鼠标或按下键盘。
如果你需要再度启动屏保,就必须重新初始化屏保的等待时间。要做到这一点你可以:
调用 SystemParametersInfo( SPI_SETSCREENSAVEACTIVE, TRUE, 0, SPIF_SENDWININICHANGE).
或者
用SetCursorPos()来模拟用户输入。
这两种方法都将促使系统重新启动屏保等待时间计数器。
嘟嘟互动视觉网站是多点触控、虚拟现实、增强现实、大屏幕投影显示等技术的交流学习网站网站