2008-10-27 41 views
25

Tôi muốn trở thành công dân phát triển tốt, pay my taxes và tắt mọi thứ nếu chúng tôi đang chạy trên Remote Desktop hoặc chạy bằng pin.C# .NET: Cách kiểm tra xem chúng tôi có đang chạy bằng pin không?

Nếu chúng tôi đang chạy trên máy tính từ xa (hoặc tương đương trong phiên máy chủ đầu cuối), chúng tôi phải tắt hoạt ảnh và đệm đôi. Bạn có thể kiểm tra điều này với:

/// <summary> 
/// Indicates if we're running in a remote desktop session. 
/// If we are, then you MUST disable animations and double buffering i.e. Pay your taxes! 
/// 
/// </summary> 
/// <returns></returns> 
public static Boolean IsRemoteSession 
{ 
    //This is just a friendly wrapper around the built-in way 
    get 
    { 
     return System.Windows.Forms.SystemInformation.TerminalServerSession; 
    } 
} 

Bây giờ tôi cần tìm hiểu xem người dùng có đang chạy bằng nguồn pin hay không. Nếu họ đang có, tôi không muốn thổi qua pin của họ. tôi muốn làm những việc như

  • hình ảnh động vô hiệu hóa
  • nền disable kiểm tra chính tả
  • vô hiệu hóa nền in
  • tắt gradient
  • sử dụng graphics.SmoothingMode = SmoothingMode.HighSpeed;
  • sử dụng graphics.InterpolationMode = InterpolationMode.Low;
  • sử dụng graphics.CompositingQuality = CompositingQuality.HighSpeed;
  • mi nimize truy cập ổ cứng - để tránh quay lên
  • giảm thiểu truy cập mạng - để tiết kiệm điện WiFi

Có cách nào quản lý để xem nếu máy là hiện chạy trên pin?

Tài liệu tham khảo

How do you convince developers to pay their "taxes"?

Taxes: Remote Desktop Connection and painting

GetSystemMetrics(SM_REMOTESESSION)

Trả lời

27

Tôi tin rằng bạn có thể kiểm tra SystemInformation.PowerStatus để xem nếu nó trên pin hay không.

Boolean isRunningOnBattery = 
     (System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus == 
     PowerLineStatus.Offline); 

Chỉnh sửa: Ngoài ra ở trên, còn có System.Windows.Forms. PowerStatus lớp học. Một trong những phương pháp của nó là PowerLineStatus, sẽ bằng PowerLineStatus.Online nếu nó trên AC Power.

+0

Điều gì tương đương với điều này đối với máy tính để bàn khi chúng đang chạy trên DC (ví dụ: UPS/IPS)? – lbrahim

4

Bạn có thể sử dụng chức năng GetSystemPowerStatus bằng P/Gọi. Xem: http://msdn.microsoft.com/en-gb/library/aa372693.aspx

Dưới đây là một ví dụ:

using System; 
using System.Runtime.InteropServices; 
namespace PowerStateExample 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public class PowerState 
    { 
     public ACLineStatus ACLineStatus; 
     public BatteryFlag BatteryFlag; 
     public Byte BatteryLifePercent; 
     public Byte Reserved1; 
     public Int32 BatteryLifeTime; 
     public Int32 BatteryFullLifeTime; 

     // direct instantation not intended, use GetPowerState. 
     private PowerState() {} 

     public static PowerState GetPowerState() 
     { 
      PowerState state = new PowerState(); 
      if (GetSystemPowerStatusRef(state)) 
       return state; 

      throw new ApplicationException("Unable to get power state"); 
     } 

     [DllImport("Kernel32", EntryPoint = "GetSystemPowerStatus")] 
     private static extern bool GetSystemPowerStatusRef(PowerState sps); 
    } 

    // Note: Underlying type of byte to match Win32 header 
    public enum ACLineStatus : byte 
    { 
     Offline = 0, Online = 1, Unknown = 255 
    } 

    public enum BatteryFlag : byte 
    { 
     High = 1, Low = 2, Critical = 4, Charging = 8, 
     NoSystemBattery = 128, Unknown = 255 
    } 

    // Program class with main entry point to display an example. 
    class Program 
    {   
     static void Main(string[] args) 
     { 
      PowerState state = PowerState.GetPowerState(); 
      Console.WriteLine("AC Line: {0}", state.ACLineStatus); 
      Console.WriteLine("Battery: {0}", state.BatteryFlag); 
      Console.WriteLine("Battery life %: {0}", state.BatteryLifePercent); 
     } 
    } 
} 
+0

Chỉ vì lợi ích của thông tin, tôi có máy tính bảng không trả lại thông tin bằng win32_Battery hoặc PowerStatus. Nhưng điều này làm việc. +1. Cảm ơn. – user1531978

-1

Tôi không tin rằng nó được hiển thị trong mã được quản lý, nhưng bạn có thể sử dụng Win32 GetSystemPowerStatus qua pinvoke để nhận thông tin này.

Ngoài ra, bạn có thể muốn xem xét sử dụng GetCurrentPowerPolicies hoặc tương tự để xác định tùy chọn người dùng liên quan đến hiệu suất/quản lý nguồn điện.

+0

Xem nhanh API (http://msdn.microsoft.com/en-us/library/aa372689(VS.85).aspx) không hiển thị bất kỳ điều gì liên quan đến bất kỳ tùy chọn người dùng nào. Nó trả về những thứ như CPU ​​sẽ chạy chậm như thế nào, và nếu màn hình bị mờ đi, quạt sẽ bị tắt, vv .. –

+0

Có - tốc độ CPU là tùy chọn người dùng có thể được điều khiển thông qua bảng điều khiển Cài đặt nguồn. Chỉ là một gợi ý. –

+0

Tôi đang mong đợi những thứ như "Tắt hoạt ảnh", "Tắt hiệu ứng trong suốt của kính", "Tắt âm thanh cảnh báo", v.v. –

7

R. Bemrose tìm thấy cuộc gọi được quản lý. Dưới đây là một số mã mẫu:

/// <summary> 
/// Indicates if we're running on battery power. 
/// If we are, then disable CPU wasting things like animations, background operations, network, I/O, etc 
/// </summary> 
public static Boolean IsRunningOnBattery 
{ 
    get 
    { 
     PowerLineStatus pls = System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus; 

     //Offline means running on battery 
     return (pls == PowerLineStatus.Offline); 
    } 
} 
+5

vui lòng chỉ cần trả lại pls == PowerLineStatus.Offline; Điều này làm tôi đau mắt. –

+0

Tôi thích một chức năng trợ giúp, để mọi người không phải tiếp tục học lại cách kiểm tra trạng thái đường dây điện. Và không ai nói rằng chỉ có một giá trị điều tra cho "trên pin". Đặc biệt vì có giá trị thứ 3 trong điều tra. tôi muốn có một triển khai đơn lẻ cho "chúng tôi đang sử dụng pin" và một cài đặt trung tâm có thể được khắc phục khi nó biến thành sai. –

+5

Không, anh ta nói rằng hàm trợ giúp là tốt, nhưng mã của bạn có kiểu chống nếu (blah) {return true; } else {return false; } khi thay vào đó nó chỉ nên được trả lại (blah); –

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