2008-10-23 5 views

답변

3

당신은 PowerModeChanged 이벤트를 사용, .NET에서 Win32_PowerManagementEvent WMI 이벤트

+0

작동하는 코드 예가 ​​있습니까? (일부 온라인 예제를 시도했지만 이벤트를 발생시키지 않는 것 같습니다.) –

6

를 모니터링 할 수 있습니다. Win32에서 WM_POWERBROADCAST 메시지를 사용하십시오.

3

얼마나 자주 모니터링할지 잘 모르겠지만 .NET에서 서비스를 작성하는 경우 ServiceBase를 재정의하고 CanHandlePowerEvent를 true로 설정하면 PowerBroadcastStatus 열거를 통해 전원 변경 사항을 통보 받게됩니다.

BEGIN_MESSAGE_MAP(CFrameworkWndDoc, CWindowDocument) 
    //{{AFX_MSG_MAP(CFrameworkWndDoc) 
    ON_WM_CHAR() 
    ON_WM_TIMER() 
    //}}AFX_MSG_MAP 
    ON_MESSAGE(WM_POWERBROADCAST, OnPowerMsgRcvd) 
END_MESSAGE_MAP() 

그런 다음 당신이 메시지 핸들러 함수를 추가해야합니다 : 비주얼 스튜디오 당신이 당신의 메시지 맵이 예에서와 같이 WM_POWERBROADCAST 메시지를 찾고에 ON_MESSAGE()를 추가해야합니다 2005 C++ MFC 응용 프로그램에서

+0

'CanHandlePowerEvent'에 대해 언급 해 주셔서 감사합니다. – n0ne

3

이 골격으로 메시지 유형에 대한 wParam 변수를 확인할 수 있도록 클래스 정의 변화와 함께 메시지 핸들러 멤버 함수를 선언합니다 :

// Handle the WM_POWERBROADCAST message to process a message concerning power management 
// such as going to Sleep or Waking Up. 
LRESULT CFrameworkWndDoc::OnPowerMsgRcvd(WPARAM wParam, LPARAM lParam) 
{ 
    switch (wParam) { 
     case PBT_APMPOWERSTATUSCHANGE: 
      TRACE0("PBT_APMPOWERSTATUSCHANGE received\n"); 
      break; 
     case PBT_APMRESUMEAUTOMATIC: 
      TRACE0("PBT_APMRESUMEAUTOMATIC received\n"); 
      break; 
     case PBT_APMRESUMESUSPEND: 
      TRACE0("PBT_APMRESUMESUSPEND received\n"); 
      break; 
     case PBT_APMSUSPEND: 
      TRACE0("PBT_APMSUSPEND received\n"); 
      break; 
    } 

    return 0; 
} 

을 내가 가진 무엇 자체 실내는 응용 프로그램에서 위의를 사용하여 테스트 윈도우 디버거에서 시작되는 7에서 실행하고 나는 수동으로 나는 다음과 같은 메시지가 표시됩니다 잠을 잘 응용 프로그램을 실행 내 PC를 만들 것입니다 : 다음

PBT_APMSUSPEND received 

을 때 내가 지금까지 발견

PBT_APMRESUMESUSPEND received 
PBT_APMRESUMEAUTOMATIC received 

모든 당신이 나오고 여부 징후가 없음을 나타냅니다 : 두 개의 메시지 하나씩하는 PC가 다시 시작되고 나는 로그인에 내가 디버거 출력 창에 표시되는 내용 수면 상태 또는 최대 절전 모드 상태 필자는 파일 및 장치 처리와 관련하여 일시 중지하거나 다시 시작할 때 수행해야 할 작업에 대해 계속 연구 중입니다. COM 포트에 대한 파일 핸들이 다시 시작된 후에 더 이상 유효하지 않다는 표시를 보았습니다. 인스턴스 연결에 대한 다른 프로세스와의 인터페이스에 대해서도 확신 할 수 없습니다.

표준 절전 모드 및 최대 절전 모드 전원 관리 상태 외에 Microsoft는 Connected Standby power state with Windows 8 and 8.1을 도입했으며이 응용 프로그램에는 응용 프로그램의 유형에 따라 일부 응용 프로그램 디자인의 영향이 있습니다.

데스크톱 응용 프로그램은 일반적으로 대기 연결 된 과 통합하기 위해 추가 작업이 필요하지 않습니다.

데스크톱 활동 중재자 (DAM)는 이 모든 데스크톱 응용 프로그램을 일시 중지하고 연결된 대기 중에 타사 시스템 서비스의 런타임을 제한하는 Windows 구성 요소입니다. DAM은 기존의 응용 프로그램 및 서비스와의 기본적인 소프트웨어 호환성을 유지하지만 수면 중에 배터리 수명에 미치는 영향을 완화합니다.

Windows는 DAM 단계가 완료된 후 대기 모드로 연결된 동안 데스크톱 응용 프로그램이 실행되지 않도록합니다. Windows에서 DAM 단계를 완료 한 후 throttle 모드에서 타사 시스템 서비스를 실행할 수 있습니다. 이 모드에서 타사 서비스는 30 초마다 벽 시계 시간이 1 초를 넘지 않고 을 실행할 수 있습니다. 인텔

The Art of Graceful Application Suspension by Lynn Merrill 그러나 모든 자료는 윈도우 XP 후 Windows에 해당하는 수 없습니다 그래서 날짜 2005입니다 Windows에서 전원 관리와 관련된 다양한 Windows 메시지 유형을 처리에 대한 몇 가지 정보가 있습니다. 이 문서에서 설명하는 메시지 시퀀스에는 Windows Vista에서 시작하여 응용 프로그램이 일시 중단 할 수 있는지 여부를 요청하는 데 사용 된 PBT_APMQUERYSUSPEND 메시지가 더 이상 Windows에서 더 이상 사용되지 않는 메시지가 하나 이상 있습니다. 이제 SetThreadExecutionState() 함수를 사용하여 절전 모드 또는 최대 절전 모드로 전환 할 때 스레드를 인터럽트 할 수 없음을 나타냅니다. 전원 관리 상태 메시지 변경에 대한 자세한 내용은 stackoverflow Can't catch sleep suspend messages (winxp)의 대답을 참조하십시오.

+0

+1 연결된 대기 모드에 대해 알지 못했고 내 Windows 서비스가 타블렛에서 오동작 한 이유가 궁금합니다. 고마워요! –

0

NetworkChange.NetworkAvailabilityChanged 및 NetworkChange.NetworkAddressChanged에 가입 할 수 있습니다.

일반적으로 시간이 초과되면 절전 모드로 전환 한 후 네트워크 통신을 재개 할 수 있도록 2 초 타이머를 시작합니다.

관련 문제