152 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using System.Threading;
 | |
| using System.Runtime.InteropServices;
 | |
| 
 | |
| namespace Urovo
 | |
| {
 | |
| 
 | |
|     #region PowerNotify Event
 | |
|     /// <summary>
 | |
|     /// PowerNotifyEventArgs
 | |
|     /// </summary>
 | |
|     public class PowerNotifyEventArgs : EventArgs
 | |
|     {
 | |
|         private uint acLineStatus;
 | |
| 
 | |
|         private uint batteryLifePercent;
 | |
| 
 | |
|         public uint ACLineStatus
 | |
|         {
 | |
|             get { return acLineStatus; }
 | |
|         }
 | |
| 
 | |
|         public uint BatteryLifePercent
 | |
|         {
 | |
|             get { return batteryLifePercent; }
 | |
|         }
 | |
| 
 | |
|         public PowerNotifyEventArgs(uint acLineStatus, uint batteryLifePercent)
 | |
|         {
 | |
|             this.acLineStatus = acLineStatus;
 | |
|             this.batteryLifePercent = batteryLifePercent;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     ///  PowerNotifyEvent Delegate
 | |
|     /// </summary>
 | |
|     /// <param name="sender"></param>
 | |
|     /// <param name="e"></param>
 | |
|     public delegate void PowerNotifyEventHandler(object sender, PowerNotifyEventArgs e);
 | |
|     #endregion
 | |
| 
 | |
|     public class PowerManager
 | |
|     {
 | |
|   
 | |
|         #region Event
 | |
|         public event PowerNotifyEventHandler PowerNotify = null;
 | |
| 
 | |
|         protected virtual void OnPowerNotify(PowerNotifyEventArgs e)
 | |
|         {
 | |
|             if (PowerNotify != null)
 | |
|             {
 | |
|                 PowerNotify(this, e);
 | |
|             }
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region Variable
 | |
|         IntPtr hMsgQ;
 | |
|         IntPtr hNotify;
 | |
| 
 | |
|         IntPtr[] hEvent = new IntPtr[2];
 | |
|         #endregion
 | |
| 
 | |
| 
 | |
|         #region Method
 | |
|         /// <summary>
 | |
|         /// Start  PowerManagement Thread
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         public bool Start()
 | |
|         {
 | |
|             hEvent[0] = Win32.CreateEvent(IntPtr.Zero, false, false, null);
 | |
| 
 | |
| 
 | |
|             Win32.MSGQUEUEOPTIONS options = new Win32.MSGQUEUEOPTIONS();
 | |
|             options.dwSize = 20;
 | |
|             options.dwFlags = 2;
 | |
|             options.dwMaxMessages = 1;
 | |
|             options.cbMaxMessage = 64;
 | |
|             options.bReadAccess = true;
 | |
| 
 | |
|             hMsgQ = Win32.CreateMsgQueue(null, options);
 | |
|             if (hMsgQ == IntPtr.Zero)
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
| 
 | |
|             hNotify = Win32.RequestPowerNotifications(hMsgQ, Win32.PBT_POWERINFOCHANGE);
 | |
|             if (hNotify == IntPtr.Zero)
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
| 
 | |
|             hEvent[1] = hMsgQ;
 | |
| 
 | |
|             Thread t = new Thread(new ThreadStart(this.PowerThreadPorc));
 | |
|             t.Start();
 | |
| 
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Stop PowerManagement Thread
 | |
|         /// </summary>
 | |
|         public void Stop()
 | |
|         {
 | |
|             PowerNotify = null;
 | |
|             Win32.EventModify(hEvent[0], Win32.EVENT_SET);
 | |
| 
 | |
|             Win32.StopPowerNotifications(hNotify);
 | |
|             Win32.CloseMsgQueue(hMsgQ);
 | |
| 
 | |
|             Win32.CloseHandle(hEvent[0]);
 | |
| 
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// PowerThreadPorc
 | |
|         /// </summary>
 | |
|         private void PowerThreadPorc()
 | |
|         {
 | |
|             while (true)
 | |
|             {
 | |
|                 uint evt = Win32.WaitForMultipleObjects(2, hEvent, false, Win32.INFINITE);
 | |
|                 switch (evt)
 | |
|                 {
 | |
|                     case 0:     //return thread
 | |
|                         return;
 | |
|                     case 1:
 | |
|                         uint bytesRead;
 | |
|                         uint flags;
 | |
|                         Win32.POWER_BROADCAST pB = new Win32.POWER_BROADCAST();
 | |
|                         if (Win32.ReadMsgQueue(hMsgQ, out pB, (uint)Marshal.SizeOf(typeof(Win32.POWER_BROADCAST)), out bytesRead, Win32.INFINITE, out flags))
 | |
|                         {
 | |
|                             if (pB.Message == Win32.PBT_POWERINFOCHANGE && pB.PI.bACLineStatus != 0x01 && pB.PI.bBatteryLifePercent <= 5)
 | |
|                             {
 | |
|                                 Win32.SetSystemPowerState(null, Win32.POWER_STATE_SUSPEND, Win32.POWER_FORCE);
 | |
|                                 break;
 | |
|                             }
 | |
|                             OnPowerNotify(new PowerNotifyEventArgs(pB.PI.bACLineStatus, pB.PI.bBatteryLifePercent));
 | |
|                         }
 | |
|                         break;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         #endregion
 | |
|     }
 | |
| }
 |