2008-10-29 33 views

Trả lời

8

Nếu bạn muốn chương trình của mình không được đưa vào trạng thái ngủ khi đang chạy, cách tốt nhất là tạo một chức năng kiểu KeepAlive gọi SystemIdleTimerReset, SHIdleTimerReset và mô phỏng một phím bấm. Sau đó, bạn cần phải gọi nó rất nhiều, về cơ bản ở khắp mọi nơi.

#include <windows.h> 
#include <commctrl.h> 

extern "C" 
{ 
    void WINAPI SHIdleTimerReset(); 
}; 

void KeepAlive() 
{ 
    static DWORD LastCallTime = 0; 
    DWORD TickCount = GetTickCount(); 
    if ((TickCount - LastCallTime) > 1000 || TickCount < LastCallTime) // watch for wraparound 
    { 
     SystemIdleTimerReset(); 
     SHIdleTimerReset(); 
     keybd_event(VK_LBUTTON, 0, KEYEVENTF_SILENT, 0); 
     keybd_event(VK_LBUTTON, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0); 
     LastCallTime = TickCount; 
    } 
} 

Phương pháp này chỉ hoạt động khi người dùng khởi động ứng dụng theo cách thủ công.

Nếu ứng dụng của bạn được bắt đầu bằng thông báo (tức là khi thiết bị bị tạm ngưng), thì bạn cần làm nhiều hơn hoặc ứng dụng của bạn sẽ bị tạm ngừng sau một khoảng thời gian rất ngắn cho đến khi người dùng tắt thiết bị chế độ. Để xử lý điều này, bạn cần phải đưa thiết bị vào chế độ năng lượng không giám sát.

if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, TRUE)) 
{ 
    // handle error 
} 

// do long running process 

if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, FALSE)) 
{ 
    // handle error 
} 

Trong khi sử dụng chế độ tự động, bạn vẫn cần phải gọi KeepAlive rất nhiều, bạn có thể sử dụng một thread riêng biệt mà ngủ cho mili giây x và gọi giữ funcation sống.

Xin lưu ý rằng chế độ không giám sát sẽ không đưa chế độ này ra khỏi chế độ ngủ, nó sẽ đặt thiết bị ở trạng thái nửa tỉnh táo.

Vì vậy, nếu bạn bắt đầu một chế độ không giám sát trong khi thiết bị ở chế độ tạm dừng, thiết bị sẽ không đánh thức màn hình hoặc bất cứ thứ gì. Tất cả chế độ không giám sát sẽ dừng WM khỏi việc tạm ngưng ứng dụng của bạn. Ngoài ra vấn đề khác là nó không hoạt động trên tất cả các thiết bị, một số thiết bị quản lý điện năng không phải là rất tốt và nó sẽ đình chỉ bạn dù sao không có vấn đề gì bạn làm.

1

Có lẽ bằng cách sửa đổi "Hệ thống điện Kỳ" là described here (nhưng trong C#)

Điều đó cũng mô tả một cách để ngăn chặn các thiết bị di động để ngủ (mà không phải là chính xác những gì bạn có thể muốn), bằng cách gọi chức năng gốc SystemIdleTimerReset() định kỳ (để ngăn thiết bị tắt nguồn).

6

Sửa đổi the Power Manager registry setting ảnh hưởng đến điều kiện ngủ cụ thể bạn muốn (timeout, batter, AC power, vv) và SetEvent trên một sự kiện hệ thống được gọi là "PowerManager/ReloadActivityTimeouts" để yêu cầu hệ điều hành tải lại cài đặt.

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