首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NativeWindow禁用屏幕保护程序

使用NativeWindow禁用屏幕保护程序
EN

Stack Overflow用户
提问于 2010-07-05 06:58:46
回答 3查看 945关注 0票数 2

我想要禁用屏幕保护程序和监视电源关闭。在这个阶段,没有窗户,我可以用它。因此,我不打算使用NativeWindow。

这是我的密码

代码语言:javascript
复制
sealed class ObserverWindow : NativeWindow, IDisposable
{
    internal ObserverWindow()
    {
        this.CreateHandle(new CreateParams()
        {
            Parent= IntPtr.Zero
        });

    }

    public void Dispose()
    {
        DestroyHandle();
    }

    protected override void WndProc(ref Message msg)
    {
        if (msg.Msg == WM_SYSCOMMAND &&
            ((((long)msg.WParam & 0xFFF0) == SC_SCREENSAVE) ||
            ((long)msg.WParam & 0xFFF0) == SC_MONITORPOWER))
        {
            msg.Msg = 0;
            msg.HWnd = IntPtr.Zero;
        }
        base.WndProc(ref msg);
    }
}

问题是,WndProc不是与WM_SYSCOMMAND一起调用的。实际上,WndProc被称为4次。最后一个电话是msg.Msg == WM_CREATE。

我想我错过了一些创建参数。有人有建议吗?

问候迈克尔

更新

我在一个非STA线程中运行代码。因此,窗口没有想到任何信息,而不是最初的消息。现在我收到了WM_SYSCOMMAND消息。但是当屏幕保护程序被激活时,就没有消息了。

我还试图用相同的结果覆盖表单的WndProc。但这曾经适用于Windows。Windows 7有变化吗?

操作系统: Windows 7 64位。

溶液

作为此问题状态中的注释,只有前台窗口可以取消屏幕保护程序。因此,上述代码无法工作。NativeWindow很适合接收消息,但不适合取消屏幕保护程序。对于后者,我推荐这个问题的答案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-05 20:25:43

正确的方法是告诉Windows您的线程需要激活显示。视频播放器常用的。P/调用SetThreadExecutionState() API函数,传递ES_DISPLAY_REQUIRED。和ES_SYSTEM_REQUIRED,以防止机器自动关闭。访问pinvoke.net以获得所需的声明。

票数 6
EN

Stack Overflow用户

发布于 2010-07-05 07:11:25

根据这篇KB文章的说法,禁用屏幕保护程序要容易得多

这可以很容易地使用以下方法完成: SystemParametersInfo( SPI_SETSCREENSAVEACTIVE,FALSE,0,SPIF_SENDWININICHANGE ); ..。 如果您需要屏幕保护程序再次启动,则需要重新初始化超时期间。通过调用SystemParametersInfo (SPI_SETSCREENSAVEACTIVE, TRUE, 0, SPIF_SENDWININICHANGE)来做到这一点。

票数 0
EN

Stack Overflow用户

发布于 2010-07-05 07:14:47

您可以尝试重写DefWndProc

代码语言:javascript
复制
public override void DefWndProc(ref Message msg)
{
    if (msg.Msg == WM_SYSCOMMAND &&
        ((((long)msg.WParam & 0xFFF0) == SC_SCREENSAVE) ||
        ((long)msg.WParam & 0xFFF0) == SC_MONITORPOWER))
    {
        msg.Msg = 0;
        msg.HWnd = IntPtr.Zero;
    }
    base.DefWndProc(ref msg);
}

我现在不是在Windows机器上,所以我不能测试这个。如果有用的话请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3177635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档