Я хочу отключить заставку и выключить монитор. На данном этапе нет оконной формы, которую я мог бы использовать. Поэтому я не хочу использовать 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.
Я думаю, что мне не хватает некоторого параметра создания. Кто-нибудь есть совет?
С уважением, Майкл
UPDATE
Я выполнял код в потоке, отличном от STA. Таким образом, окно не показывало никаких сообщений, кроме начальных. Теперь я получаю сообщения WM_SYSCOMMAND. Но когда заставка активирована, сообщения нет.
Я также пытался переписать WndProc формы с тем же результатом. Но это работало в Windows XP. Есть ли изменения в Windows 7?
ОС: Windows 7 64bit.
РЕШЕНИЕ
Как комментарий в этом Вопросе , только экранное окно может отменить заставку Таким образом, приведенный выше код не может работать. NativeWindow отлично подходит для получения сообщений, но не для отмены заставки. Для последнего я рекомендую ответ на этот вопрос.