gpt4 book ai didi

c# - 使用 NativeWindow 禁用屏幕保护程序

转载 作者:行者123 更新时间:2023-12-03 20:33:29 29 4
gpt4 key购买 nike

我想禁用屏幕保护程序并关闭显示器电源。在这个阶段,还没有 Windows 窗体,我可以使用它。因此我不想使用 NativeWindow。

这是我的代码

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 XP 中工作。 Windows 7 有变化吗?

操作系统:Windows 7 64位。

解决方案

作为此评论 Question规定,只有前台窗口可以取消屏保。因此上面的代码无法工作。 NativeWindow 非常适合接收消息,但不适合取消屏幕保护程序。对于后者,我推荐这个问题的答案。

最佳答案

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

关于c# - 使用 NativeWindow 禁用屏幕保护程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3177635/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com