2010-02-01 10 views
1

화면 보호기를 시작하려고 할 때 내 C++ 응용 프로그램에서 알림을 수신하려고합니다. 나는 메시지를 wParam == SC_SCREENSAVEsome people think should do the trick와 함께 들으려고 노력했다. 그건 작동하지 않았다. 스파이 ++는 내 창문에 어떤 메시지도받지 못했음을 나타냈다. WM_SYSCOMMAND. 흥미로운 것은 모니터를 끄고 wParam == SC_MONITORPOWER이라는 메시지를 받았을 때입니다. 나는 그것을 잘못 이해하고 있는가? 아니면 내가 뭔가를 놓친거야?화면 보호기 알림 수신

편집 : 테스트를 위해 기본 Windows 스크린 세이버 (Windows 로고가있는 스크린 세이버)를 사용했습니다.

+0

테스트를 위해 실제 화면 보호기 세트가 있습니까? 아니면 검은 색 화면입니까? –

답변

1

내 창에 포커스가있을 때만 SC_SCREENSAVE 메시지가 나타납니다. 이 문제를 해결하는 방법은 global hook입니다. 그게 나를 put the callback function in a separate DLL로 요구하고 시스템을 느리게하는 후크에 관한이 무서운 메시지가있어서 스크린 세이버 시작에 응답한다는 생각을 떨어 뜨리기로 결정했습니다.

0

이것은 비교적 복잡한 작업입니다 (쉽지만 좋을지라도).

이러한 테스트 중 일부는 온라인에서만 작동하며 창에 포커스가있는 경우에만 작동합니다. 백그라운드에서 실행중인 경우 이러한 메시지가 수신되지 않을 수 있습니다.

다른 테스트는 실행중인 스크린 세이버 프로그램 (현재 설정된 스크린 세이버를 확인한 다음 프로세스 목록을보고 활성화되어 있는지 확인)을 사용하지만 절전 모드로 전환하거나 화면 보호기가 검은 색이면 작동하지 않습니다 화면 (즉, 프로그램 없음, 모니터 끄기).

나는 이것을 할 수있는 이상적인 방법이 있다고 생각하지 않습니다. 처음으로 돌아가서 왜이 상태를 감지해야하는지, 그리고 무엇을 성취하려고하는지 더 자세히 생각하고 싶을 수도 있습니다. 다른 솔루션이 필요할 수 있습니다.

+0

사용자에게 눈에 거슬리는 방식으로 알려 드리고 싶습니다. 내 생각은 화면 보호기가 시작되거나 모니터의 전원이 켜지면 그것을 표시하는 것이 었습니다. 그렇게하면 나는 아무 것도 방해하지 않을 것이다. – MMx

0

아마도 내 대답이 너무 늦었을 것입니다.

MSDN은 "레거시"아래의 화면 보호기를 처리합니다. 노트북에서 배터리를 낭비하고 PC에서도 쓸모가 없습니다. 화면 보호기를 표시하는 것보다 모니터를 끄는 것이 좋습니다.

정확히 무엇을하고 싶은지 설명하지 않으므로 세이버가 시작되기 전에 알림이 필요한지 또는 이미 시작한 시점에 알림을 받기에 충분하다는 것을 알지 못합니다.

후자의 경우 쉽습니다. 주기적으로 검사하는 스레드를 작성하십시오.

BOOL b_SaverRunning; 
    SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &b_SaverRunning, 0); 
관련 문제