怎样结束屏幕保护?? 我想在程序里定时结束系统的屏幕保护,请问应该怎么做? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 W2k中如何终止屏幕保护(hangwire发表于2001-11-17 9:30:59) [问题]:我编写了一个报警程序,功能是当我的报警程序接到报警消息时,必须终止屏幕保护程序或者节能模式并显示报警消息,或者在屏幕保护程序之上显示报警消息也可以。我用SetWindowPos(&wndTopMost…)试过不灵,在W2k的屏保中也没有成功。我的程序想在W2k里运行,如何在特定的事件发生时终止屏幕保护?[解答]:在Windows 9x中,终止屏幕保护的方法很简单,获取活动窗口指针,然后发送WM_CLOSE消息即可:PostMessage(GetActiveWindow(),WM_CLOSE,0,0);但是,在W2k中这个方法就不灵了,W2k的桌面概念与以往不同,其屏幕保护是运行在专门的桌面当中,这个桌面叫做"Screen-saver"。你用GetActiveWindow 或者 GetForegroundWindow函数是找不到屏幕保护窗口的,因为它运行在另外的桌面里。要获得屏保窗口,你必须打开这个专门的桌面,列举其中的所有窗口,判断窗口是不是屏幕保护窗口,如果保护窗口可见,则发送WM_CLOSE消息。详细代码如下(或者参见MSDN KB 文章Q140723):BOOL CALLBACK KillScreenSaverFunc(HWND hwnd, LPARAM lParam){ if(IsWindowVisible(hwnd)) PostMessage(hwnd, WM_CLOSE, 0, 0); return TRUE;}// 打开屏保专用桌面"Screen-saver"//HDESK hdesk = OpenDesktop(TEXT("Screen-saver"), 0, // flags FALSE, // new processes inherit handle? DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS); // access/////////////////// 用专门的"close"函数列举窗口并关闭桌面。//if (hdesk) { EnumDesktopWindows(hdesk, KillScreenSaverFunc, 0); CloseDesktop(hdesk);} 模拟键盘 用Keybd_event模拟鼠标按键用mouse_event函数 以下是禁用屏幕保护的代码:void DisableScrSaver(){ BOOL bScrActive; SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &bScrActive, 0); if (bScrActive) { SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0); } }以下是启用屏幕保护的代码:void CNetRGCltDlg::EnableScrSaver(){ SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0);} 程序崩溃了 (高手请进)请问OnKeyDown函数里不能实现TextOut吗? 聊天程序的编辑框实现?图片/默认表情,如何传送的问题 关于IE7 和 IE8 下 DDE 操作? 单文档程序中,关于全局变量的疑问? COM接口传递图片的问题 讲讲▲动态密匙▲啊。和CRC32有什么关系呢? 请问哪里能够下载免费电子工程书籍?多谢。 怎样在控制台程序中连接数据库 发现了VC2008类中的一个BUG,欢迎讨论。 如何停止屏幕保护程序? 初学一问:CCtrlView类有什么用啊
W2k中如何终止屏幕保护(hangwire发表于2001-11-17 9:30:59) [问题]:
我编写了一个报警程序,功能是当我的报警程序接到报警消息时,必须终止屏幕保护程序或者节能模式并显示报警消息,或者在屏幕保护程序之上显示报警消息也可以。我用SetWindowPos(&wndTopMost…)试过不灵,在W2k的屏保中也没有成功。我的程序想在W2k里运行,如何在特定的事件发生时终止屏幕保护?[解答]:
在Windows 9x中,终止屏幕保护的方法很简单,获取活动窗口指针,然后发送WM_CLOSE消息即可:
PostMessage(GetActiveWindow(),WM_CLOSE,0,0);
但是,在W2k中这个方法就不灵了,W2k的桌面概念与以往不同,其屏幕保护是运行在专门的桌面当中,这个桌面叫做"Screen-saver"。你用GetActiveWindow 或者 GetForegroundWindow函数是找不到屏幕保护窗口的,因为它运行在另外的桌面里。要获得屏保窗口,你必须打开这个专门的桌面,列举其中的所有窗口,判断窗口是不是屏幕保护窗口,如果保护窗口可见,则发送WM_CLOSE消息。详细代码如下(或者参见MSDN KB 文章Q140723):
BOOL CALLBACK KillScreenSaverFunc(HWND hwnd, LPARAM lParam)
{
if(IsWindowVisible(hwnd))
PostMessage(hwnd, WM_CLOSE, 0, 0);
return TRUE;
}
// 打开屏保专用桌面"Screen-saver"
//
HDESK hdesk = OpenDesktop(TEXT("Screen-saver"),
0, // flags
FALSE, // new processes inherit handle?
DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS); // access/////////////////
// 用专门的"close"函数列举窗口并关闭桌面。
//
if (hdesk) {
EnumDesktopWindows(hdesk, KillScreenSaverFunc, 0);
CloseDesktop(hdesk);
}
模拟鼠标按键用mouse_event函数
void DisableScrSaver()
{
BOOL bScrActive;
SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &bScrActive, 0);
if (bScrActive)
{
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
}
}
以下是启用屏幕保护的代码:
void CNetRGCltDlg::EnableScrSaver()
{
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0);
}