Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2011, 19:21   #1
dab00
Пользователь
 
Регистрация: 23.09.2009
Сообщений: 46
По умолчанию Пишем HTML-приложение для мониторинга ресурсов Windows [статья]


Однажды, в студеную зимнюю... заинтересовал меня вопрос мониторинга ресурсов Windows, а конкретно (хочется добавить "чисто" конкретно) мониторинга объема свободной памяти (физической и виртуальной), процента использования файла подкачки и загрузки процессоров.
Казалось бы - ничего особенного - для этого существуют соответствующие классы WMI. Однако заинтересовал меня этот вопрос потому, что необходимо было реализовать "игру цветом", т.е. в случае уменьшения объема ресурса цвет индикатора должен был измениться на "более красный".
Итак. В этой статье я предлагаю Вам отправиться в увлекательное путешествие по изучению изменения цвета окна .
Поехали? Открываем блокнот. Пишем HTA:
dab00 вне форума Ответить с цитированием
Старый 11.11.2011, 19:22   #2
dab00
Пользователь
 
Регистрация: 23.09.2009
Сообщений: 46
По умолчанию Продолжение

Код:
<head>
  <title>ResMon</title>
  <HTA:APPLICATION 
	ID = "ResMon"
    APPLICATIONNAME="ResMon"    
    SINGLEINSTANCE="yes"
	MAXIMIZEBUTTON = "no"
	SCROLL="no"
	ShowInTaskbar ="no"
	BORDER="none"	
	Version = "1.0">
	</HTA:APPLICATION>
</head>

<script language="VBScript">
	Sub Window_OnLoad()		
		window.setTimeout "SetColor "& 0 & "," & 0 & "," & 255,1, "vbscript"
	End Sub	
	
	'переводим число из RGB в Hex для HTML
	Function GetStrHex(i)
		If i < 16 Then
			GetStrHex = "0" & Hex(i)
		Else
			GetStrHex = Hex(i)
		End If		
	End Function
	
	'рекурсивная процедура изменения цвета
	Sub SetColor(x,y,z)
		window.document.body.style.background = "#" & GetStrHex(x) & GetStrHex(y) & GetStrHex(z)
		x = x + 1
		z = z - 1
		If z <> 0 Then window.setTimeout _
				"SetColor " & x & "," & y & "," & z,5, "vbscript"		
	End Sub	
</script> 
<body></body> 
</html>
dab00 вне форума Ответить с цитированием
Старый 11.11.2011, 19:23   #3
dab00
Пользователь
 
Регистрация: 23.09.2009
Сообщений: 46
По умолчанию Продолжение

Сохраняем, запускаем... Правда красиво? Кажется наше путешествие заканчивается, не успев начаться , а чтобы сделать его "увлекательным" я опишу алгоритм.

При загрузке окна мы запускаем рекурсивную процедуру изменения цвета SetColor, которая и выставляет цвет окна - window.document.body.style.backgrou nd используя функцию перевода RGB в Hex GetStrHex. Начинаем с 0,0,255 - "радикально синего" цвета . Далее, в процессе рекурсии, каждые 5 миллисекунд процедура SetColor добаляет "красного" - x = x + 1, и убавляет "синего" - z = z - 1, до тех пор, пока цвет окна не станет "радикально красным" - If z <> 0 Then.

А теперь давайте попробуем изменить палитру - начать с зеленого. Для этого достаточно изменить пару строчек:
window.setTimeout "SetColor "& 0 & "," & 255 & "," & 0,1, "vbscript" - чтобы начать с зеленого цвета,
и y = y - 1 вместо z = z - 1 - чтобы убавлять "зеленый".

Теперь, когда у нас есть алгоритм изменения цвета мы можем приступить к реализации алгоритма мониторинга целевых ресурсов.
Для мониторинга процента загрузки процессоров используем WMI-класс Win32_Processor, файла подкачки - Win32_PageFileUsage, свободной физической и виртуальной памяти - Win32_OperatingSystem, объема физической памяти - Win32_PhysicalMemory.

Открываем блокнот, пишем не более сложный чем прежде код:

Последний раз редактировалось dab00; 11.11.2011 в 19:25.
dab00 вне форума Ответить с цитированием
Старый 11.11.2011, 19:26   #4
dab00
Пользователь
 
Регистрация: 23.09.2009
Сообщений: 46
По умолчанию Продолжение

Код:
<html>
<head>
  <title>ResMon</title>
  <HTA:APPLICATION 
	ID = "ResMon"
    APPLICATIONNAME="ResMon"    
    SINGLEINSTANCE="yes"
	MAXIMIZEBUTTON = "no"
	SCROLL="no"
	ShowInTaskbar ="no"
	BORDER="none"
	SELECTION="no"
	Version = "1.0">
	</HTA:APPLICATION>
</head>
<style type="text/css">
	html, body{
		margin:1px;
		text-align: center;   
		font:bold 12 sans-serif;   
		border-style: outset;
		color: #ffffff;
	}	
	#menu{		
		background-color: #800000;	
	}
	#closebtn{
		position: absolute; 
		top: 1px; 
		right: 1px; 	
	}
	/* Цвета по умолчанию */
	#pRAM,#swap{
		background-color: #0000ff;
	}
	#vRAM,#proc{
		background-color: #00ff00;
	}
	
 </style>
<script language="VBScript">
	Option Explicit	
	Const strHash = "#"		
	'----- WMI-запросы -----
	Const strOSQ = "Select FreePhysicalMemory, FreeVirtualMemory, TotalVirtualMemorySize From Win32_OperatingSystem"
	Const strPMQ = "Select Capacity From Win32_PhysicalMemory"
	Const strPFUQ = "Select AllocatedBaseSize, CurrentUsage From Win32_PageFileUsage"
	Const strPQ = "Select LoadPercentage From Win32_Processor"
	Const intPSF = 48 'флаг полусинхронности
	'-----------------------
	Dim objItem	
	Dim intTotal, intFreePart, intFreePartV, intFreePartP, intProcRate, intFreePartProc
	Dim intOSInfoArr(2), intOSInfo
	Dim intPFUInfoArr(1), intPFUInfo
	Dim i
	
	Dim objWMI, wshShell	
	Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
	Set wshShell = CreateObject("WScript.Shell")	
	
	Sub Window_OnLoad()	
		'устанавливаем размер о позицию приложения
		window.resizeTo 245,80
		window.moveTo screen.availWidth-255, screen.availHeight-90		
		'устанавливаем обработку событий окна
		SetUpEventHandler()			
		'устанавливаем заголовок приложения
		header.Innertext = ResMon.APPLICATIONNAME
		'запускаем процедуру обновления информации
		window.setTimeout "UpdateInfo", 1, "vbscript"	
	End Sub
	
	'----- Обработка событий окна приложения -----	
	Sub SetUpEventHandler()
		Dim ClosebtnOnclick, MouseOverClose, MouseOutClose		
		'закрываем окно
		Set ClosebtnOnclick = GetRef("OnClickCloseSub")
		closebtn.attachEvent "onclick", ClosebtnOnclick
		Set MouseOverClose = GetRef("MouseOverCloseSub")
		closebtn.attachEvent "onmouseover", MouseOverClose
		Set MouseOutClose = GetRef("MouseOutCloseSub")
		closebtn.attachEvent "onmouseout", MouseOutClose		
	End Sub	
	'---------------------------------------------
	
	'----- Закрыть -----
	Sub OnClickCloseSub()		
		Window_OnUnload
	End Sub	
	
	Sub MouseOverCloseSub()
		closebtn.Style.Cursor = "hand"
		closebtn.style.backgroundColor = "#ff8c00"		
	End Sub
	
	Sub MouseOutCloseSub()
		closebtn.style.backgroundColor = "#800000"
	End Sub
	'--------------------	
		
	Sub Window_OnUnload()		
		Set wshShell = Nothing
		Set objWMI = Nothing
		window.close
	End Sub
	
	Sub UpdateInfo()		
		'информация из Win32_OperatingSystem: свободная физическая память, 
		'свободная виртуальная память, полный объем виртуальной памяти
		intOSInfo = GetOSInfo()
		intTotal = GetTotalMemorySize() 'полный объем физической памяти
		intPFUInfo = GetPFUInfo() 'информация о файле подкачки
		intProcRate = GetProcRate() 'процент свободного времени процессоров
		 
		'процент свободных ресурсов в масштабе изменения RGB
		intFreePart = Int(intOSInfo(0)/intTotal*255) 'физической
		intFreePartV = Int(intOSInfo(1)/intOSInfo(2)*255) 'виртуальной
		intFreePartP = Int(intPFUInfo(0)/intPFUInfo(1)*255) 'подкачки
		intFreePartProc = Int(intProcRate*2.55) 'процессоры
		
		'выводим количество ресурсов
		fpRAM.Innertext = intOSInfo(0)     
		tpRAM.Innertext = intTotal
		fvRAM.Innertext = intOSInfo(1)
		tvRAM.Innertext = intOSInfo(2)
		fswap.Innertext = intPFUInfo(0)
		tswap.Innertext = intPFUInfo(1)
		procrate.Innertext = intProcRate
		
		'выставляем цвет окна: "#" + R + G + B, вариант от синего к красному
		pRAM.style.backgroundColor = strHash & _
				GetStrHex(255-intFreePart) & GetStrHex(0) & GetStrHex(intFreePart)
		'вариант от зеленого к красному, прочие варианты - по аналогии
		vRAM.style.backgroundColor = strHash & _
				GetStrHex(255-intFreePartV) & GetStrHex(intFreePartV) & GetStrHex(0)
		'снова от синего - подкачка				
		swap.style.backgroundColor = strHash & _
				GetStrHex(255-intFreePartP) & GetStrHex(0) & GetStrHex(intFreePartP)
		'снова от зеленого - процессор		
		proc.style.backgroundColor = strHash & _
				GetStrHex(255-intFreePartProc) & GetStrHex(intFreePartProc) & GetStrHex(0)
		'курим 1 секунду и вызываем сами себя :)
        window.SetTimeout "UpdateInfo()", 1000, "vbscript"
    End Sub
dab00 вне форума Ответить с цитированием
Старый 11.11.2011, 19:27   #5
dab00
Пользователь
 
Регистрация: 23.09.2009
Сообщений: 46
По умолчанию Продолжение

Код:
'получаем объем свободной памяти
	Function GetOSInfo()
		Dim colOS
		Set colOS = objWMI.ExecQuery(strOSQ,,intPSF)
		For Each objItem In colOS
			With objItem
				intOSInfoArr(0) = Int(.FreePhysicalMemory/1024)
				intOSInfoArr(1) = Int(.FreeVirtualMemory/1024)
				intOSInfoArr(2) = Int(.TotalVirtualMemorySize/1024)			
			End With
        Next		
		Set colOS = Nothing
		GetOSInfo = intOSInfoArr
	End Function
	
	'получаем объем физической памяти
	Function GetTotalMemorySize()
		Dim colPM
		Set colPM = objWMI.ExecQuery(strPMQ,,intPSF)
		For Each objItem In colPM
            GetTotalMemorySize = GetTotalMemorySize + Int(objItem.Capacity/1024/1024)
        Next
		Set colPM = Nothing
	End Function
	
	'получаем объем файла подкачки
	Function GetPFUInfo()
		Dim colPFL
		Set colPFL = objWMI.ExecQuery(strPFUQ,,intPSF)
		For Each objItem In colPFL
			With objItem
				'свободно = объем - использовано
				intPFUInfoArr(0) = .AllocatedBaseSize - .CurrentUsage 
				intPFUInfoArr(1) = .AllocatedBaseSize 'объем				
			End With
        Next
		Set colPFL = Nothing
		GetPFUInfo = intPFUInfoArr
	End Function
	
	'получаем процент загрузки процессоров
	Function GetProcRate()
		Dim colP
		Set colP = objWMI.ExecQuery(strPQ,,intPSF)
		i = 0
		For Each objItem In colP
			i = i + 1
            GetProcRate = GetProcRate + objItem.LoadPercentage			
        Next
		'вычисляем среднее арифметическое на случай, если процессоров несколько
		GetProcRate = 100-(GetProcRate/i)
		Set colP = Nothing
	End Function
	
	'переводим число из RGB в Hex для HTML
	Function GetStrHex(i)
		If i < 16 Then
			GetStrHex = "0" & Hex(i)
		Else
			GetStrHex = Hex(i)
		End If		
	End Function
	
</script> 
<body>	
	<div id="menu">
		<span id="header"></span><span id="closebtn">X</span>
	</div>
	<div id="pRAM">
		Физическая память:* <span id="fpRAM"></span>* из* <span id="tpRAM"></span>* MB		
	</div>
	<div id="vRAM">
		Виртуальная память:* <span id="fvRAM"></span>* из* <span id="tvRAM"></span>* MB
	</div>
	<div id="swap">
		Файл подкачки:* <span id="fswap"></span>* из* <span id="tswap"></span>* MB
	</div>
	<div id="proc">
		Процессоры:* <span id="procrate"></span>* из 100%
	</div>
</body> 
</html>
dab00 вне форума Ответить с цитированием
Старый 11.11.2011, 19:29   #6
dab00
Пользователь
 
Регистрация: 23.09.2009
Сообщений: 46
По умолчанию Завершение

При загрузке приложение принимает необходимый размер, выставляется в нужную позицию, устанавливает обработку события нажатия на кнопку закрытия окна и запускает рекурсивную процедуру обновления информации о целевых ресурсах UpdateInfo, которая, в свою очередь, раз в секунду выполняет WMI-запросы к заявленным выше WMI-классам и обновляет информацию окна HTA.
Сохраняем, запускаем... Вуаля.

В развитие разработки, с помощью библиотеки DAHTACOM можно установить позицию окна приложения "поверх всех", закинуть иконку приложения в область уведомлений, использовать PNG-изображение с альфа-каналом в качестве "корпуса" окна HTA... Но это уже совсем другая история...

В завершение нашего "путешествия" хочу обратить Ваше внимание на то, что для запуска полученного в результате приложения, а чисто конкретно (давно собирался использовать этот речевой оборот) для подключения к службе WMI необходимо обладать правами администратора.

Что получилось - на скриншоте и во вложении.
Вложения
Тип файла: zip ResMon-v1.0.ZIP (3.8 Кб, 49 просмотров)
dab00 вне форума Ответить с цитированием
Старый 05.04.2012, 21:46   #7
kiber_punk
Пользователь
 
Регистрация: 17.06.2008
Сообщений: 16
Восклицание dab00 - ЗЛОСТНЫЙ ВОРИШКА. бей его...

ЧТО ЭТО ЗА СЛОВОБЛУДИЕ?!

dab00, неуважаемый, а вы не слишком-ли разогнались в погоне за пиаром?
А автора, или ссылку на первоисточник, не забыл указать?

Цитата:
"Казалось бы - всё просто…"
А знаешь ли ты, паразит, сколько я бессонных ночей потратил вытягивая это «ПРОСТО»?!

Знаешь ли ты что такое "эврика!" ?
И всё для чего? Чтобы на пустом месте пропиарить твою бестолковую бухгалтерскую жопу?

Понавесило свистелок, приписал авторство, и под аккомпанемент слащавых и безинформативных речей (вы только вчитайтесь в любую из статей!) заспамил все посещаемые тематические ресурсы (изначально было (!)115).

Ни "можно взять и вытрать Вашу подпись?", ни даже слова "спасибо"!

На контакт не выходит.
И только через пол года после выдвинутой ему первой предъявы (вероятно, при давлеяни администрации VR'а) получаю от него одно лишь коротенькое сообщение:
Цитата:
Сообщение от dab00
>> Удаляю с [перечисляет 5 ресурсов]
>> Удаляю на vr-online и считаю вопрос закрытым.
И всё!
Эко ты разогнался, вопрос только открывается, будет худо - терпи и плати по заслугам.

dab00 - подлый меркантильный и бессовестный персонаж - на VR-online он это доказал и даже не собирался опровергать - игнорировал и кривлялся в ответ.

Большинство статей под ником dab00 - плагиат, рестайл и копипаста.
бей его...
Прошу добавить в начало статьи соответствующую пометку.

Вот что посоветуете с ним делать, товарищи?

Последний раз редактировалось kiber_punk; 05.04.2012 в 23:13.
kiber_punk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пишем VBS-приложение для преображения кода VB [статья] dab00 JavaScript, Ajax 10 06.10.2012 17:14
Пишем WinLocker на VB [статья] dab00 JavaScript, Ajax 2 12.01.2012 19:30
Статья: Низкоуровневое сетевое программирование. Пишем клиент/серверное приложение на сокетах Беркли oleg kutkov C/C++ Сетевое программирование 42 22.01.2011 00:35
Новый двухкнопочный калькулятор для новой операционной системы. Пишем новые программы для BolgenOS. Ecosasha Софт 16 06.06.2010 13:32
обновление в блоге - Низкоуровневое сетевое программирование. Пишем клиент/серверное приложение на сокета Pblog Обсуждение статей 0 01.11.2009 22:20