2008-10-23 39 views

Trả lời

19

Microsoft.Win32.SystemEvents.PowerModeChanged sự kiện sẽ cung cấp cho bạn thông tin này. Sự kiện này có sẵn trong tất cả các biến thể của khung công tác .NET do Microsoft phát hành cho đến nay.

3

Bạn có thể theo dõi Win32_PowerManagementEvent WMI kiện

+0

Bạn có ví dụ về mã hoạt động không? (đã thử một số ví dụ trực tuyến nhưng chúng dường như không kích hoạt sự kiện) –

3

Không chắc chắn tần suất bạn muốn theo dõi điều này, nhưng nếu bạn viết dịch vụ .NET, bạn có thể ghi đè ServiceBase, đặt CanHandlePowerEvent thành true và sau đó bạn sẽ được thông báo về thay đổi quyền lực thông qua liệt kê PowerBroadcastStatus.

+0

Cảm ơn bạn đã đề cập đến 'CanHandlePowerEvent', đó là vấn đề của tôi! – n0ne

3

Trong Visual Studio 2005 ứng dụng C++ MFC bạn sẽ cần phải thêm một ON_MESSAGE() vào bản đồ thông điệp của bạn tìm kiếm thông điệp WM_POWERBROADCAST như trong ví dụ này:

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() 

Sau đó, bạn sẽ cần phải thêm các chức năng xử lý tin nhắn cùng với sự thay đổi định nghĩa lớp để khai báo các hàm thành viên cho xử lý thông điệp để bạn có thể kiểm tra các biến wParam cho các loại thông điệp như trong bộ xương này:

// 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; 
} 

những gì tôi có se en là một thử nghiệm bằng cách sử dụng nêu trên trong một ứng dụng chạy trên Windows 7 được bắt đầu vào trình gỡ lỗi và sau đó tôi tự làm cho máy tính của tôi chạy các ứng dụng để ngủ tôi sẽ thấy thông báo sau:

PBT_APMSUSPEND received 

Sau đó, khi PC được khởi động lại và tôi đăng nhập những gì tôi sẽ thấy trong cửa sổ đầu ra debugger được hai thông điệp một sau khi khác:

PBT_APMRESUMESUSPEND received 
PBT_APMRESUMEAUTOMATIC received 

Tất cả những gì mà tôi đã tìm thấy cho đến nay chỉ ra rằng bạn không có dấu hiệu cho thấy cho dù bạn đang sắp ra trạng thái Ngủ hoặc trạng thái Hibernate. Tôi vẫn đang nghiên cứu thêm về những gì cần phải được thực hiện khi tạm ngưng hoặc khi tiếp tục cho đến nay như tập tin và thiết bị xử lý. Tôi đã thấy chỉ dẫn rằng tập tin xử lý các cổng COM không còn giá trị sau khi nối lại. Tôi cũng không chắc chắn về các giao diện cho các quá trình khác cho các kết nối cơ sở dữ liệu ví dụ.

Ngoài các trạng thái quản lý nguồn Sleep và Hibernate chuẩn, Microsoft đã giới thiệu Connected Standby power state with Windows 8 and 8.1 có một số nhánh thiết kế ứng dụng tùy thuộc vào loại ứng dụng.

Ứng dụng dành cho máy tính để bàn thường không yêu cầu thêm công việc để tích hợp với kết nối dự phòng.

Trình điều khiển hoạt động trên máy tính để bàn (DAM) là thành phần Windows tạm dừng tất cả các ứng dụng dành cho máy tính để bàn và điều chỉnh thời gian chạy của các dịch vụ hệ thống của bên thứ ba trong thời gian chờ kết nối.Mục đích của DAM là duy trì khả năng tương thích phần mềm cơ bản với các ứng dụng và dịch vụ hiện có , nhưng giảm thiểu tác động của chúng lên tuổi thọ pin trong khi ngủ.

Windows ngăn các ứng dụng máy tính để bàn chạy trong bất kỳ phần nào của chế độ chờ kết nối sau khi giai đoạn DAM hoàn tất. Windows cho phép dịch vụ hệ thống của bên thứ ba thực hiện ở chế độ điều chỉnh sau khi hoàn thành giai đoạn DAM. Ở chế độ này, dịch vụ của bên thứ ba có thể chạy không quá một giây đồng hồ treo tường mỗi 30 giây.

The Art of Graceful Application Suspension by Lynn Merrill từ Intel có một số thông tin về xử lý các loại thông báo Windows khác nhau liên quan đến Power Management trong Windows tuy nhiên ngày nay không phải tất cả các tài liệu có liên quan đến Windows sau Windows XP. Có ít nhất một tin nhắn không còn được sử dụng trong chuỗi thông báo được mô tả trong tài liệu này khi bắt đầu với Windows Vista thông báo PBT_APMQUERYSUSPEND được sử dụng để yêu cầu liệu ứng dụng có thể tạm ngưng không còn được Windows sử dụng hay không. Chức năng SetThreadExecutionState() hiện được sử dụng để cho biết rằng một chuỗi không thể bị gián đoạn với sự thay đổi trạng thái Ngủ hoặc Ngủ đông. Xem câu trả lời trong stackoverflow Can't catch sleep suspend messages (winxp) để biết chi tiết về thay đổi thông báo trạng thái Quản lý nguồn.

+0

+1 Không biết về chế độ chờ kết nối và tự hỏi tại sao dịch vụ windows của tôi bị lỗi trên máy tính bảng. Cảm ơn nhiều! –

0

Bạn có thể đăng ký NetworkChange.NetworkAvailabilityChanged và NetworkChange.NetworkAddressChanged.

Tôi thường bắt đầu bộ hẹn giờ hai giây để tôi có thể tiếp tục truyền thông mạng sau khi ở chế độ ngủ khi hết giờ.

Các vấn đề liên quan