积极答复者
vc后台程序运行时如何阻止系统启动屏幕保护?

问题
-
如题,vc后台程序运行时如何阻止系统启动屏幕保护?
目前找到了三个办法
1: 修改注册表 HKEY_CURRENT_USER\ControlPanel\desktop\ScreenSaveActive
缺陷: 修改后需要重启
2: ::SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, SPIF_SENDCHANGE)
缺陷: 需要有管理员权限的用户来运行
3: 响应 WM_SYSCOMMAND (wParam:SC_SCREENSAVE) 消息
缺陷: 只有程序激活时才有效
我的程序在系统后台运行,运行用户不一定具有设置屏保的权限,所以上面的几种方法都不能用。
我在网上查到有人说使用定时发送鼠标消息的办法可以实现,
然后我试了下面几个消息:
::PostMessage(GetDesktopWindow(), WM_NULL, NULL, NULL);
::PostMessage(GetDesktopWindow(), WM_CLOSE, NULL, NULL);
::PostMessage(GetDesktopWindow(), WM_LBUTTONDOWN, NULL, MAKELPARAM(point.x, point.y));
但是都没有实现。
不知道哪位有办法在我目前这种状况下实现阻止系统启动屏幕保护?
感激不尽 ^_^
岁月- 已移动 周雪峰MVP, Moderator 2009年2月12日 5:22 移动到相应技术版 (从 一般性问题讨论区 移动到 Visual C++)
答案
-
发消息并没有模拟鼠标移动,当然是没反应的.
有个API是mouse_event(或者SendInput),用这个就没问题了.The mouse_event function synthesizes mouse motion and button clicks.
Windows NT/2000/XP: This function has been superseded. Use SendInput instead.
Syntax
VOID mouse_event(
DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, ULONG_PTR dwExtraInfo );
Hello world- 已标记为答案 岁月 2009年2月13日 1:49
全部回复
-
你好,
可以尝试使用SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,FALSE,NULL,TRUE);但是需要注意在进程退出的时候把上下文恢复。那么就需要在设置之前记录当前的Screen save状态,在推出的时候设回去。需要注意进程异常退出的情况。
或者参考http://www.codeproject.com/KB/system/disablescreensave.aspx -
发消息并没有模拟鼠标移动,当然是没反应的.
有个API是mouse_event(或者SendInput),用这个就没问题了.The mouse_event function synthesizes mouse motion and button clicks.
Windows NT/2000/XP: This function has been superseded. Use SendInput instead.
Syntax
VOID mouse_event(
DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, ULONG_PTR dwExtraInfo );
Hello world- 已标记为答案 岁月 2009年2月13日 1:49
-
使用 SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,FALSE,NULL,TRUE); 需要登陆用户具有修改屏保设置的权限,有些用户是没有这个权限的.
使用 SendInput 是极好的办法,我原来一直以为SendMessage发送那些鼠标消息就是模拟了鼠标事件,现在终于明白鼠标键盘事件是这样发送到操作系统的
非常感谢楼上几位的帮助
实现代码如下:
INPUT input;
memset(&input, 0, sizeof(INPUT));
input.type = INPUT_MOUSE;
input.mi.dwFlags = MOUSEEVENTF_MOVE;
SendInput(1, &input, sizeof(INPUT));
岁月