我想要禁用屏幕保护程序和监视电源关闭。在这个阶段,没有窗户,我可以用它。因此,我不打算使用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。Windows 7有变化吗?
操作系统: Windows 7 64位。
溶液
作为此问题状态中的注释,只有前台窗口可以取消屏幕保护程序。因此,上述代码无法工作。NativeWindow很适合接收消息,但不适合取消屏幕保护程序。对于后者,我推荐这个问题的答案。
发布于 2010-07-05 20:25:43
正确的方法是告诉Windows您的线程需要激活显示。视频播放器常用的。P/调用SetThreadExecutionState() API函数,传递ES_DISPLAY_REQUIRED。和ES_SYSTEM_REQUIRED,以防止机器自动关闭。访问pinvoke.net以获得所需的声明。
发布于 2010-07-05 07:11:25
根据这篇KB文章的说法,禁用屏幕保护程序要容易得多
这可以很容易地使用以下方法完成: SystemParametersInfo( SPI_SETSCREENSAVEACTIVE,FALSE,0,SPIF_SENDWININICHANGE ); ..。 如果您需要屏幕保护程序再次启动,则需要重新初始化超时期间。通过调用
SystemParametersInfo (SPI_SETSCREENSAVEACTIVE, TRUE, 0, SPIF_SENDWININICHANGE)来做到这一点。
发布于 2010-07-05 07:14:47
您可以尝试重写DefWndProc。
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机器上,所以我不能测试这个。如果有用的话请告诉我。
https://stackoverflow.com/questions/3177635
复制相似问题