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