1

Тема: HTA: Traffic Monitor

Монитор трафика для сетевого подключения с интерактивным выбором интерфейса\сетевой карты.

Отображает:
         - кол-во входящего, отправленного и суммарный объём трафика;
         - текущую скорость прокачки Кб/c;
         - денежный расход (округление до 1kb);

Чтобы переместить окно программы:  зажать ПКМ и плавно перетащить окно в нужное место. Либо с клавиатуры (считаю это намного удобнее) - зажать CTRL и перетащить окно с помощью стрелочек (Left,Right,Up,Down).

Цена за трафик по умолчанию - 1.2 [у.е.]/mb.
Чтобы изменить стоимость мегабайта трафика -  проще и надёжнее изменить исх.код (см. стр. 102), но если же вы захотите делать пересчёты в реальном режиме:
1) двойной клик по окну программы;
2) ввести во всплывающей подсказке новую стоимость;

 <!-- Name:		Traffic_monitor.hta
	  Language:	HyperText Application
	  Author:	Аскет,	true-script@ya.ru
	  Description: This is traffic monitor.
					Displays sent, received, total amount kBytes,  current speed and expense of money for internet-connection.
					Based on WMI (this is a such complex and higher technology, than winAPI)
 
	  Using:	For moving window - press 'Right mouse button' ("ПКМ") and fluent move of window.
                For correction the price for 1 mb traffic - 1) Dblclick on program-window
															2) input your price in popup-prompt.
															
															
 -->
 
 
 <HTML>
   <HEAD>
   <TITLE>Traffic monitor v1.1</TITLE>
   <HTA:APPLICATION
        ID="oHTA"
        APPLICATIONNAME="Traffic monitor"
        BORDER="NONE"
        BORDERSTYLE=""
        SCROLL="NO"
        SELECTION=NO
        CAPTION="yes"
        ICON=""
        MAXIMIZEBUTTON="no"
        MINIMIZEBUTTON="no"
        SHOWINTASKBAR="no"
        SINGLEINSTANCE="YES"
        SYSMENU="NO"
        VERSION="1.1"
        WINDOWSTATE="" />
        
	 <script>
		window.resizeTo(120,100); window.moveTo(screen.availWidth-122, screen.availHeight-120);
	 </script> 
	<meta NAME=author VALUE=="Gorelov Alexander, Jule 2011">
</HEAD>
 
 <style>
html, body{
   margin:0px;
   padding:0px;
   font:10;
   border-style: OUTset;
}
 </style>

   <BODY SCROLL="no" bgcolor="#88FFC4" onkeydown='moveMe()'>
<!----------------------------->
<TABLE CELLSPACING="0" CELLPADDING="0"BORDER="0"WIDTH="100%" HEIGHT="100%" STYLE="FONT:11">
	 <TR style="font-weight:bold">
		  <TD >Total, mb: </TD>
		  <TD ALIGN="RIGHT" id=total></TD>
	 </TR>
	 <TR>
		  <TD>Received, mb:</TD>
		  <TD ALIGN="RIGHT" id=Received></TD>
	 </TR>
	 <TR>
		  <TD>Sent, mb:</TD>
		  <TD ALIGN="RIGHT" id=Sent></TD>
	 </TR>
	 <TR style="font-weight:">
		  <TD>Speed, kbps:</TD>
		  <TD ALIGN="RIGHT" id=speed></TD>
	 </TR>
	 <TR style="font-weight:bold;color:red">
		  <TD>Money:</TD>
		  <TD ALIGN="RIGHT" id=PriceField></TD>
	 <TR>
	 <TD colspan=2>
			<SELECT ID=CONNECTIONS onChange="changeConnection()"  style='width:100%;HEIGHT:1; background:#DCF6ED;font=7pt "Ms sarif"'>
			</SELECT>
	 </TD>
	 </TR>
</TABLE>

<script type="text/javascript">
     var x0, y0;
     document.onmousemove=function () {
         if ((event.button!=0)&&(event.button!=1)){
        // if (event.button!=0){
             window.moveBy(event.x-x0, event.y-y0);
             return false;
         }
         document.body.style.cursor="auto";
     }

     document.onmousedown=function () {
         if (event.button!=1){
             x0=event.x; y0=event.y;
         }
     }

</script>

<script language=VBS>
	Public InterfaceName         'имя сетевого интерфейс
	Public price : price = 1.2					'цена за мегабайт трафика
	DIM M1 :M1 = 0
	updateInfo()


SUB window_onload
	call getConnection()
	InterfaceName = CONNECTIONS.options(0).value
END SUB


'----------  ----------
SUB updateInfo()
on error resume next
	for each PROPS in ( GetObject ("WINMGMTS:").ExecQuery _
	 ("SELECT BytesTotalPersec,BytesReceivedPersec,BytesSentPersec FROM Win32_PerfRawData_Tcpip_NetworkInterface WHERE NAME=" & "'" & InterfaceName & "'" ))
		total.Innertext 	 = round(PROPS.BytesTotalPersec / 1048576,3)
		Received.Innertext = round(PROPS.BytesReceivedPersec / 1048576 ,3)
		Sent.InnerTEXT		 = round(PROPS.BytesSentPersec / 1048576,3)	
		PriceField.InnerTEXT= round((PROPS.BytesTotalPersec 	/ 1048576) * price ,2) & ""	
			'----------  расчёт скорости ----------
		speed.InnerText = round((PROPS.BytesTotalPersec-M1)/1024,2)
		M1 = PROPS.BytesTotalPersec
	next
	window.SetTimeout "updateInfo()",1000							
END SUB

'----------  ----------	
SUB document_ondblclick()
	price = Inputbox ("Стоимость мегабайта:","Traffic monitor v1.1   /by Аскет",price )
END SUB	

'---------- [ЗАПОЛНЕНИЕ СПИСКА ПОДКЛЮЧЕНИЙ] ----------
SUB getConnection()
		for each conn in ( GetObject ("WINMGMTS:").ExecQuery _
		 ("SELECT * FROM Win32_PerfRawData_Tcpip_NetworkInterface"))
			a=a & vbcr & conn.name
			set newopt = document.createElement("OPTION")
			newopt.text=conn.name
			newopt.value=conn.name
			CONNECTIONS.options.add newopt
		next
END SUB
'---------- [ИЗМЕНЕНО ПОДКЛЮЧЕНИЕ] ----------
SUB changeConnection()
	if CONNECTIONS.Selectedindex=-1 then exit sub
	InterfaceName = CONNECTIONS.options(CONNECTIONS.SelectedIndex).value
END SUB
</script>

<script>
// to move window -  press CTRL and by keys of the cursor
function moveMe() {
	if (event.ctrlKey) {
			if (event.keyCode==37) { var top=window.screenTop;window.moveTo(window.screenLeft-10,top);}
		else {
			if (event.keyCode==39) { var top=window.screenTop;window.moveTo(window.screenLeft+10,top);};
		else {
			if (event.keyCode==38) { var left=window.screenLeft;window.moveTo(left,window.screenTop-10);};
		else {
			if (event.keyCode==40) { var left=window.screenLeft;window.moveTo(left,window.screenTop+10);};
		}}}}}
</script>
<!----------------------------->
	</BODY>
</HTML>

2 (изменено: Poltergeyst, 2015-05-24 22:30:57)

Re: HTA: Traffic Monitor

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

Lang.: VBScript
ОС: WinXP

подписка


'--------------------------------------------------------------------------------
' Подписка на WMI событие отключения от глобальной сети с записью статистики сеанса в протокол.
' Подходит для модемного соединения.
'
' Lang.: VBScript
' OC WinXP 
'--------------------------------------------------------------------------------

 Dim objShell, objService, objFilter, objConsumer, objFilterPath, objConsumerPath, objBinding

 Set objShell = CreateObject("WScript.Shell")
 Set objService = GetObject("WINMGMTS:{impersonationLevel=Impersonate}!\\.\ROOT\CIMV2")
    
 '/Создание фильтра событий NetworkLogFilter/
 '---------------------------------------------------------------------------
 Set objFilter = objService.Get("__EventFilter").SpawnInstance_()

 With objFilter
     .Name = "NetworkLogFilter"
     .QueryLanguage = "WQL"
     .EventNamespace = "ROOT\CIMV2"
     .Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 4 WHERE TargetInstance ISA ""Win32_PerfRawData_Tcpip_NetworkInterface"""
    Set objFilterPath = .Put_()
 End With

 '/Потребитель событий NetworkLogConsumer/
 '---------------------------------------------------------------------------
 Set objConsumer = objService.Get("LogFileEventConsumer").SpawnInstance_()

 With objConsumer
     .Name = "NetworkLogConsumer"
     .FileName = objShell.SpecialFolders.Item("MyDocuments") & "\NetworkLog.txt"
     .Text = "%TargetInstance.BytesSentPersec%" & vbTAB & _
        "%TargetInstance.BytesReceivedPersec%" & vbTAB & _
        "%TargetInstance.BytesTotalPersec%"
    Set objConsumerPath = .Put_()
 End With

 '/Связка фильтра и потребителя/
 '---------------------------------------------------------------------------
 Set objBinding = objService.Get("__FilterToConsumerBinding").SpawnInstance_()

 With objBinding
     .Filter = objFilterPath
     .Consumer = objConsumerPath
     .Put_()
 End With

 MsgBox "Подписка на событие отключения от глобальной сети с записью статистики сеанса в протокол." & vbCRLF & _
     objFilterPath.Path & vbCRLF & _
     objConsumerPath.Path, vbSystemModal + vbInformation, "Subscribe"

 WScript.Quit()

отмена подписки


'--------------------------------------------------------------------------------
' Отмена подписки.
'
' Lang.: VBScript
' OC WinXP 
'--------------------------------------------------------------------------------

 Dim objService, objSet, objConsumer, objFilter
 Dim sFilter

 Set objService = GetObject("WINMGMTS:{impersonationLevel=Impersonate}!\\.\ROOT\CIMV2")

 Err.Clear
 On Error Resume Next

 '/Удаление связки/
 '---------------------------------------------------------------------------
 Set objSet = objService.ExecQuery("SELECT * FROM __FilterToConsumerBinding")
 For Each obj In objSet
     sFilter = CStr(obj.Filter)
     If InStr(sFilter, "NetworkLogFilter")<>0 Then obj.Delete_()
 Next

 '/Удаление фильтра и потребителя/
 '---------------------------------------------------------------------------
 Set objConsumer = objService.Get("LogFileEventConsumer.Name=""NetworkLogConsumer""")
 Set objFilter = objService.Get("__EventFilter.Name=""NetworkLogFilter""")

 objConsumer.Delete_()
 objFilter.Delete_()
 '---------------------------------------------------------------------------
 If Err.Number<>0 Then
    MsgBox Err.Description, vbExclamation + vbSystemModal, "Error"
 Else
    MsgBox "Отмена подписки.", vbInformation + vbSystemModal, "Reply"
 End If
 WScript.Quit()