none
vc后台程序运行时如何阻止系统启动屏幕保护? RRS feed

  • 问题

  •  如题,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++)
    2009年2月11日 8:49

答案

  • 发消息并没有模拟鼠标移动,当然是没反应的.
    有个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
    2009年2月12日 11:46
    版主

全部回复

  • 你好!
         隔一段时间发一个鼠标移动的消息试试。 

    周雪峰
    2009年2月11日 10:01
    版主
  • 经测试发送 WM_MOUSEMOVE 达不到效果~~
    我将 GetDesktopWindow() 换成  桌面Listview的句柄也不行。
    另外对桌面Listview发送 WM_MOUSEMOVE 消息会影响到桌面图标的拖拽
    不知道还有没有其它办法?
    岁月
    2009年2月12日 1:12
  • 我帮你移动到Visual C++版,让那里的专家看看!
     

    周雪峰
    2009年2月12日 5:21
    版主
  •  你好,
    可以尝试使用SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,FALSE,NULL,TRUE);但是需要注意在进程退出的时候把上下文恢复。那么就需要在设置之前记录当前的Screen save状态,在推出的时候设回去。需要注意进程异常退出的情况。
    或者参考http://www.codeproject.com/KB/system/disablescreensave.aspx
    2009年2月12日 11:26
    版主
  • 发消息并没有模拟鼠标移动,当然是没反应的.
    有个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
    2009年2月12日 11:46
    版主
  • 使用 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));
    岁月
    2009年2月13日 1:48