亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? housekp.cpp

?? 該代碼壓縮包只為需要研究CE下的任務管理器的實現而提供的。某些通用的頭文件沒有包含在其中
?? CPP
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*---------------------------------------------------------------------------*\
 *
 * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
 * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED 
 * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
 * 
 *
 *  file:  HOUSEKP.CPP
 *  purpose: Implement Sample shell memory & battery monitoring activities
 *
\*---------------------------------------------------------------------------*/

#include <windows.h>
#include <windowsx.h>
#include "minshell.h"
#include "minshrc.h"


//////////////////// Memory-level monitoring /////////////////////////
//
// The memory level monitoring works as follows. We compute a free memory
// threshold (the default is 40 pages or 128KB, whichever is higher, 
// but it can be set in the registry). On a 5min timer, we check free mem
//
// As soon as it drops below a threshold, we find the LAST top-level window
// (presumably the user's least-recently-used app) and send it a WM_HIBERNATE
// messages. At the next tick, if the memory level is adequate, we're done. 
// If not then we send the next-to-last top-level window the message, and so on
// As long as we're in the too-little-memory state, we remember all the windows
// we've sent this message to, and each time we send the message to one new
// window, working our way from the back forward. If we have done this 32 times
// and are still too low on memory, then we just sent the mesage to all the 
// remaining windows.  
//
// NOTE: Apps are expected to respond to the WM_HIBERNATE message by "going into
// hibernation", i.e. freeing up as much memory as possible and generally reducing
// their footprint to a minimum. However there is no mechanism that enforces this
// A poorly-design app may not do anything on receipt of this message, and as a 
// result the user may experience low-memory problems despite this mechanism.
//

#define HIBERNATE_BELOW             0x20000 //  128KB 
#define HIBERNATE_BELOW_PAGES       0x28
#define MAX_HIB_LIST				32
DWORD cbHibernateBelow;
BOOL  fCleanUpHibernate;
// List of windows we have sent WM_HIBERNATE message to already
HWND rghwndHibernated[MAX_HIB_LIST];
DWORD dwNumHibernated;

// check whether the HWND is one to which we have already sent a WM_HIBERNATE
// returns 0 for not on list, 1 for on list, -1 for list-full
DWORD IsHibernated(HWND hwnd)
{
	int i;
	for(i=0; i<(int)dwNumHibernated; i++)
	{
		if(hwnd == rghwndHibernated[i])
			return 1;
	}
	if(i==MAX_HIB_LIST)
		return -1;
	else
		return 0;
	
}

// add a window to the "hibernated" list
void SetHibernated(HWND hwnd)
{
	if(dwNumHibernated < MAX_HIB_LIST)
		rghwndHibernated[dwNumHibernated++]=hwnd;
}

//
// This is the function called on the 5mins timer tick. We check the free 
// memory level & if too-low, go into the WM_HIBERNATE algorithm described 
// above.
//
void DoHibernate(void)
{
	
	MEMORYSTATUS ms;

	// If this is the first time through, calculate the threshold
 	if (0 == cbHibernateBelow) 
 	{
 		SYSTEM_INFO sysinfo;
		HKEY		hkeyHibernate = NULL;
		DWORD		dwHibernateBelow = HIBERNATE_BELOW;
		DWORD		dwHibernateBelowPages = HIBERNATE_BELOW_PAGES;
		DWORD		dwSize;
		DWORD		dwType;

 		GetSystemInfo(&sysinfo);

		// try to read hibernate data from registry, if we fail, just use the defaults
		if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\Hibernate"), 0, 0, &hkeyHibernate)) {
			goto setHibernateThreshold;
		}
		dwSize = sizeof(dwHibernateBelow);
		if (ERROR_SUCCESS != RegQueryValueEx(hkeyHibernate, TEXT("Bytes"), NULL, &dwType, (LPBYTE) &dwHibernateBelow, &dwSize)
				|| dwType != REG_DWORD) {
			// default to original dwHibernateBelow value
			dwHibernateBelow = HIBERNATE_BELOW;
			goto setHibernateThreshold;
		}
		dwSize = sizeof(dwHibernateBelowPages);
		if (ERROR_SUCCESS != RegQueryValueEx(hkeyHibernate, TEXT("Pages"), NULL, &dwType, (LPBYTE) &dwHibernateBelowPages, &dwSize)
				|| dwType != REG_DWORD) {
			// default to original dwHibernateBelowPages value
			dwHibernateBelowPages = HIBERNATE_BELOW_PAGES;
//			goto setHibernateThreshold;
		}

setHibernateThreshold:
 		cbHibernateBelow = max (dwHibernateBelow, dwHibernateBelowPages * sysinfo.dwPageSize);
		if (hkeyHibernate) {
			RegCloseKey(hkeyHibernate);
		}
	}

	memset(&ms, 0, sizeof(MEMORYSTATUS));
	ms.dwLength = sizeof(MEMORYSTATUS);
	GlobalMemoryStatus(&ms);

	// Do we have enough free memory?
 	if (ms.dwAvailPhys < cbHibernateBelow) 
 	{
 		BOOL fDidSomething = FALSE;
 		
 		RETAILMSG(1, (TEXT("NEED TO HIBERNATE: bytes free: %u\n"), ms.dwAvailPhys));

		// set this flag so the next time we're above the threshold we reset the Hibernated array
		if (!fCleanUpHibernate)
			fCleanUpHibernate = TRUE;

		// Iterate through all windows. Ignore all non-top-level windows. 
		// Ignore desktop & taskbar. Don't ignore popups. Some apps (such as 
		// RNAPP) have just a dialog as their toplevel window.
		for(HWND hwndApp=GetWindow(g_hwndDesktop, GW_HWNDLAST); 
				hwndApp; hwndApp=GetWindow(hwndApp, GW_HWNDPREV))
		{
			if ( IsWindowVisible(hwndApp) &&
				 (hwndApp != g_hwndDesktop) &&
				 (hwndApp != g_hwndTaskBar) && 
				 !GetWindow(hwndApp, GW_OWNER) /*&&
				 !(GetWindowLong(hwndApp, GWL_STYLE) & WS_POPUP)*/)
			{
				// find the bottom-most window that we havn't already sent a hibernate msg to
				int fHib = IsHibernated(hwndApp);
				if(fHib==0)
				{
					// not hibernated. send it a msg
					RETAILMSG(1, (TEXT("HIBERNATE: Sending to %x\n"), hwndApp));
					PostMessage(hwndApp, WM_HIBERNATE, 0, 0);
					SetHibernated(hwndApp);
			 		fDidSomething = TRUE;
					break; 
					// done with loop
				}
				else if (fHib== -1)
				{
					// Our hibernated array overflowed. Send it a hibernate msg anyway
					RETAILMSG(1, (TEXT("HIBERNATE overflow: Sending GLOBAL Hibernate to %x\n"), hwndApp));
					PostMessage(hwndApp, WM_HIBERNATE, 0, 0);
			 		fDidSomething = TRUE;
					// keep going in loop. send msg to *everyone* after this
				}
				// else current window has been hibernated. try next
			}
		}
		if(!fDidSomething)
			RETAILMSG(1, (TEXT("HIBERNATE: Didn't find anyone\n")));
	}
	else
	{
		// If we have enough free memory and if it is the first time in
		// this state after a hibernating cycle, then clean-up our window list
		if (fCleanUpHibernate) 
		{
 			RETAILMSG(1, (TEXT("HIBERNATE reset: bytes free: %u\n"), ms.dwAvailPhys));
			dwNumHibernated = 0; // clean up window list
			fCleanUpHibernate=FALSE;
		}
	}
}
//
//
//////////////////// END Memory-level monitoring END /////////////////////////

//////////////////// Battery level Warnings //////////////////////////////////
//
// All we do here is on each 5min tick, we call the battery drivers for 
// battery state (both main & backup) and if it's too low, we put up a warning.
// We actually have two-levels of warning -- low & critically low.
//
// The dialogs are modeless, so when we return at the next timer tick, we 
// check if (a) the battery level has improved (e.g. user switched in a new
// battery or plugged in AC) in which case we should dismiss the dialog OR
// (b) we still have a problem, in which case we should bring the dialog to
// thw front
//

void ShowPowerWarning(HWND hwnd, UINT nID);
LRESULT CALLBACK PowerWarningDlgProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);

// Remembered power/battery state from last time
BYTE ACLineStatus, BatteryFlag, BackupBatteryFlag;
UINT dwMainVLowStart, dwBackupVLowStart;

void DoPowerCheck(HWND hwndParent)
{
	SYSTEM_POWER_STATUS_EX ps;
	
	if (GetSystemPowerStatusEx(&ps, TRUE)) 
	{
// Useful to simulate the warnings for test purposes
//#define TESTBATTERY     1
#ifdef TESTBATTERY
		ps.ACLineStatus = AC_LINE_OFFLINE;
		if (GetAsyncKeyState(VK_MENU)) {
			ps.BatteryFlag = BATTERY_FLAG_CRITICAL;

		}else if (GetAsyncKeyState(VK_SHIFT)) {
			ps.BatteryFlag = BATTERY_FLAG_LOW;

		}else{
			ps.BatteryFlag = BATTERY_FLAG_HIGH;
		}
#endif //TESTBATTERY

		// if AC state changed
		if (ACLineStatus != ps.ACLineStatus) 
		{
			ACLineStatus  = ps.ACLineStatus;
			// NOTE: Reset this in order to force a change below.
			BatteryFlag = 0;
		}

		// if battery state changed
		if (BatteryFlag != ps.BatteryFlag) 
		{
			// Reset our global vars
			BatteryFlag  = ps.BatteryFlag;
			dwMainVLowStart = 0;

			// check main battery state IFF we're on AC power
			if (ACLineStatus != AC_LINE_ONLINE) 
			{
				switch (ps.BatteryFlag) 
				{
					case BATTERY_FLAG_HIGH:
						// if battery is good, dismiss the warning dlg, if any
						if (g_hwndMBVL) 
							PostMessage(g_hwndMBVL, WM_COMMAND, IDOK, 0);
						break;

					case BATTERY_FLAG_LOW:
						break;

					case BATTERY_FLAG_CRITICAL:
					case BATTERY_FLAG_NO_BATTERY:
						// show warning dlg. Remember this time so we can 
						// periodically bring the dlg to the front
						dwMainVLowStart = GetTickCount();
						ShowPowerWarning(hwndParent, IDD_MAIN_VLOW);
						break;

					default:
					break;
				}
			}
		}

		// if backup battery state changed
		if (BackupBatteryFlag != ps.BackupBatteryFlag) 
		{
			// Reset our global vars
			BackupBatteryFlag = ps.BackupBatteryFlag;
			dwBackupVLowStart = 0;

			switch (ps.BackupBatteryFlag) 
			{
				case BATTERY_FLAG_HIGH:  // Backup Battery High
					// if battery is good, dismiss the warning dlgs, if any
					if (g_hwndBBL) PostMessage(g_hwndBBL, WM_COMMAND, IDOK, 0);
					if (g_hwndBBVL) PostMessage(g_hwndBBVL, WM_COMMAND, IDOK, 0);
					break;

				case BATTERY_FLAG_LOW:  // Backup Battery Low
					// Show warning dlg. NOTE: This dlg is less critical than
					// the VLOW dlg, so we don't keep bringing it to the front
					ShowPowerWarning(hwndParent, IDD_BACKUP_LOW);
					break;

				case BATTERY_FLAG_CRITICAL:   // Backup Battery Critical
				case BATTERY_FLAG_NO_BATTERY: // No system battery
					// show warning dlg. Remember this time so we can 
					// periodically bring the dlg to the front
					dwBackupVLowStart = GetTickCount();
					ShowPowerWarning(hwndParent, IDD_BACKUP_VLOW);
					break;

				default:
					break;
			}
		}
	}


#define RENOTIFY_INTERVAL 240000	// 4 minute, time in ms

	DWORD dwCurrent = GetTickCount();
	if (dwMainVLowStart) 
	{
		// If we've been in this state for more than 4mins
		// bring the warning dlg to the front again
		if ((dwCurrent - dwMainVLowStart) > RENOTIFY_INTERVAL) 
		{
			dwMainVLowStart = dwCurrent;
			ShowPowerWarning(hwndParent, IDD_MAIN_VLOW);
		}
	}

	if (dwBackupVLowStart) 
	{
		// If we've been in this state for more than 4mins
		// bring the warning dlg to the front again
		if ((dwCurrent - dwBackupVLowStart) > RENOTIFY_INTERVAL) 
		{
			dwBackupVLowStart = dwCurrent;
			ShowPowerWarning(hwndParent, IDD_BACKUP_VLOW);
		}
	}
}

//
// Launch the correct warning dialog (note it's modeless, so we stick the 
// HWND in a global var, so that the owning (taskbar) thread's message
// loop can dispatch our messages. 
//
// If the dialog is already up, bring it to the foreground
// 
void ShowPowerWarning(HWND hwnd, UINT nID)
{
	switch(nID) 
	{
		case IDD_BACKUP_LOW:
			if (g_hwndBBL) {
				SetForegroundWindow(g_hwndBBL);
			}else{
				g_hwndBBL = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_BACKUP_LOW), NULL,
											  (DLGPROC)PowerWarningDlgProc, IDD_BACKUP_LOW);
				ShowWindow(g_hwndBBL, SW_SHOWNORMAL);
			}
			break;

		case IDD_BACKUP_VLOW:
			if (g_hwndBBVL) {
				SetForegroundWindow(g_hwndBBVL);
			}else{
				g_hwndBBVL = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_BACKUP_VLOW), NULL,
											   (DLGPROC)PowerWarningDlgProc, IDD_BACKUP_VLOW);
				ShowWindow(g_hwndBBVL, SW_SHOWNORMAL);
			}
			break;

		case IDD_MAIN_VLOW:
			if (g_hwndMBVL) {
				SetForegroundWindow(g_hwndMBVL);
			}else{
				g_hwndMBVL = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_MAIN_VLOW), NULL,
											   (DLGPROC)PowerWarningDlgProc, IDD_MAIN_VLOW);
				ShowWindow(g_hwndMBVL, SW_SHOWNORMAL);
			}
			break;

		default:
			break;
	}

} 

//
// This wndproc is shared by all 3 battery warnings. LPARAM of WM_INITDIALOG
// is the dialog RC ID, so we know which dialog we're in!
// NOTE: These dialogs are modeless so we need to explicitly destroy ourselves
//
LRESULT CALLBACK PowerWarningDlgProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
	switch (msg) {
		case WM_INITDIALOG:
			SetWindowLong(hwnd, DWL_USER, lp);
			CenterWindowSIPAware(hwnd, TRUE);
			MessageBeep((UINT)-1);
			return TRUE;
			break;

		case WM_COMMAND:
			switch (GET_WM_COMMAND_ID(wp,lp)) 
			{
				case IDOK:
				case IDCANCEL:
					// Modeless dialogs so we need to explicitly destroy 
					// ourselves set to NULL the global var with our HWND
					lp = GetWindowLong(hwnd, DWL_USER);
					switch (lp) {
						case IDD_BACKUP_LOW:
							g_hwndBBL = NULL;
							break;

						case IDD_BACKUP_VLOW:
							g_hwndBBVL = NULL;
							break;

						case IDD_MAIN_VLOW:
							g_hwndMBVL = NULL;
							break;
					}
					DestroyWindow(hwnd);
					break;

				default:
					break;
			}
			break;
	}
    return FALSE;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色悠久久久久综合欧美99| 欧洲色大大久久| 91国产成人在线| 欧美xxxxxxxx| 亚洲综合色丁香婷婷六月图片| 蜜桃91丨九色丨蝌蚪91桃色| 色噜噜狠狠色综合中国| 久久嫩草精品久久久精品一| 性感美女极品91精品| 91影视在线播放| 国产视频一区在线观看| 免费人成网站在线观看欧美高清| 91免费视频网址| 国产欧美日韩三级| 国产在线一区观看| 日韩欧美综合在线| 日韩黄色小视频| 欧美在线啊v一区| 亚洲免费观看高清在线观看| 国产精品一区二区x88av| 欧美一区二区三区啪啪| 偷窥国产亚洲免费视频 | 国产精品女同一区二区三区| 免费人成黄页网站在线一区二区| 欧美性生活大片视频| 亚洲精品老司机| 成人黄色网址在线观看| 国产精品视频你懂的| 国产精品18久久久久久久久 | 国产精品资源网站| 精品国产免费人成在线观看| 久久99热99| 欧美第一区第二区| 精品一区二区国语对白| 精品久久久久久综合日本欧美| 久久国产视频网| 精品国产a毛片| 国产精品一区二区久久精品爱涩| 久久精品人人爽人人爽| 国产精品99久久久久| 国产清纯白嫩初高生在线观看91| 国产成人鲁色资源国产91色综| 国产日韩亚洲欧美综合| 成人av电影在线| 亚洲男人的天堂网| 欧美日韩一区高清| 日韩成人一级大片| 2020日本不卡一区二区视频| 国产精品一区专区| 成人欧美一区二区三区1314| 91精品国产色综合久久ai换脸 | 欧美电影一区二区| 麻豆一区二区三| 国产视频一区在线播放| 91丨porny丨国产入口| 亚洲影视资源网| 欧美一区二区性放荡片| 国产精品99精品久久免费| 亚洲素人一区二区| 欧美日韩色一区| 国产美女娇喘av呻吟久久| 国产色产综合产在线视频| 91网站黄www| 日韩影院精彩在线| 国产日韩欧美不卡| 在线观看日韩国产| 国产精品18久久久久| 亚洲欧美电影院| 日韩欧美国产麻豆| 97精品国产露脸对白| 蜜桃传媒麻豆第一区在线观看| 国产亚洲福利社区一区| 欧美性三三影院| 国产成人午夜精品5599| 亚洲国产毛片aaaaa无费看| wwww国产精品欧美| 欧美视频在线播放| 国产不卡免费视频| 视频一区免费在线观看| 国产精品久久久久aaaa| 欧美精品tushy高清| 波多野结衣视频一区| 免费在线观看一区| 亚洲精品高清在线| 国产视频一区二区在线| 91精品国产综合久久久蜜臀粉嫩 | 日韩视频中午一区| 色999日韩国产欧美一区二区| 老司机精品视频线观看86 | 99久久精品99国产精品| 久久国内精品视频| 亚洲综合在线免费观看| 中文字幕欧美日本乱码一线二线| 欧美一区二区三区在线| 欧美在线观看一区| 色综合久久66| 成人美女视频在线看| 国产一区二区在线观看免费| 午夜精品久久久久久久久| 亚洲精品视频免费观看| 国产精品免费久久| 国产亚洲人成网站| 欧美大胆一级视频| 717成人午夜免费福利电影| 日本韩国精品在线| 91丝袜国产在线播放| 成人手机在线视频| 国产999精品久久久久久| 精油按摩中文字幕久久| 久久精品国产免费| 久久国产剧场电影| 久久99蜜桃精品| 美女脱光内衣内裤视频久久影院| 视频一区视频二区中文| 视频一区欧美精品| 日本sm残虐另类| 免费成人在线网站| 激情六月婷婷综合| 国产乱人伦精品一区二区在线观看| 久久福利视频一区二区| 精品无码三级在线观看视频| 韩国一区二区视频| 国产成人精品免费网站| 国产高清久久久久| av综合在线播放| 色8久久人人97超碰香蕉987| 欧美午夜在线一二页| 欧美日韩视频在线一区二区| 欧美一区二区三区视频在线观看| 欧美一卡二卡三卡| 精品粉嫩aⅴ一区二区三区四区| 26uuu欧美日本| 国产欧美一区二区精品性色超碰| 国产精品久久久久毛片软件| 亚洲欧美电影院| 日韩国产欧美在线观看| 极品少妇xxxx精品少妇| 高清不卡一区二区在线| 91首页免费视频| 欧美精品一二三四| 精品国产乱码久久久久久影片| 久久精品人人做人人综合| 国内外成人在线| 9i看片成人免费高清| 欧美日韩在线观看一区二区| 欧美大胆人体bbbb| 综合在线观看色| 日产国产欧美视频一区精品| 国产精品一区二区三区乱码| 色偷偷88欧美精品久久久| 欧美一级黄色片| 中文字幕欧美日本乱码一线二线| 亚洲国产欧美另类丝袜| 国产一二三精品| 欧美亚洲日本一区| 久久午夜电影网| 亚洲午夜视频在线| 国产露脸91国语对白| 欧美日免费三级在线| 久久先锋影音av鲁色资源网| 亚洲一区二区免费视频| 国产精品99久久久久久久女警| 91豆麻精品91久久久久久| 久久午夜电影网| 亚洲成av人片在线观看| 丁香五精品蜜臀久久久久99网站| 欧美日韩中文国产| 国产精品久久久一区麻豆最新章节| 日韩成人精品在线观看| k8久久久一区二区三区| 欧美大片在线观看| 亚洲国产精品一区二区www在线| 国产精品系列在线观看| 在线成人av影院| 亚洲一区视频在线观看视频| 成人性视频免费网站| 欧美mv和日韩mv的网站| 亚洲一级二级在线| k8久久久一区二区三区| 久久网站热最新地址| 免费在线观看日韩欧美| 欧美三级乱人伦电影| 亚洲精品国产视频| 不卡的av中国片| 欧美—级在线免费片| 精品亚洲免费视频| 欧美一区二区三区视频在线观看| 一区二区三区国产豹纹内裤在线| 99在线精品观看| 中文字幕欧美激情一区| 国产成人精品午夜视频免费 | 欧美日韩大陆在线| 亚洲精品午夜久久久| 99这里都是精品| 国产精品伦理一区二区| 成人免费视频视频| 日本一区二区高清| 成人免费毛片嘿嘿连载视频| 国产欧美精品一区二区三区四区| 国产成人综合在线观看|